分析:碼死我了這道題......
第一次用矩陣樹定理+高斯消元做題. o(n^3)可以跑過前50%的點. 對於k = 1的點,直接輸出1即可.關鍵是有乙個取模操作......
一開始我用double存答案,因為最後要取絕對值,取模的話不好弄,乾脆用double就能不取模了. 打完之後要存到long long中,發現會爆掉,於是用fmod函式取模,發現結果又不對.
正確的做法是利用行列式變換的性質. 行列式的兩行交換會使答案取反,那麼ans = -ans即可. 行列式的一行取反也會使得答案取反. 為了保證最後取模得到的結果是正確的. 需要保證高斯消元陣列a中的每個元素都是 < mod並且 ≥ 0的. 當要消第i個元素時,將這一行全部取模. 如果其<0,則將這一行全部反轉. 再來消. 每消一次就要換行一次.(有點類似於更相減損術中的大數-小數),答案也跟著變.這樣利用long long就能存下答案了.
#include #include#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const ll mod = 1e9+7
;const
double eps = 1e-9
;double d[1010][1010],c[1010][1010
];ll n,k,ans,a[
1010][1010
];void
solve()
for (int j = i + 1; j <= n; j++)
ll t = a[i][i] /a[j][i];
for (int k = i; k <= n; k++)
a[i][k]=(a[i][k]-t*a[j][k]+mod)%mod;
for (int k = i; k <= n; k++)
swap(a[i][k],a[j][k]);
ans = -ans;}}
ans = ans * a[i][i] %mod;
}ans = (ans % mod + mod) %mod;
}int
main()
}for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
a[i][j] = d[i][j] -c[i][j];
solve();
printf(
"%lld\n
",ans);
}return0;
}
省選模擬60 題解
考慮乙個暴力做法。維護乙個堆,每次取出深度最大的點,如果他還沒有覆蓋,那麼就給答案增加 1 否則直接跳過,然後直接跳到他的 k 級祖先加入堆中,複雜度是 o n 2log 的。然後發現這樣乙個事情,這個複雜度肯定是不滿的。比如說對於單次操作,複雜度大概就是答案大小 log 級別的。考場上大概想到了這...
2018 2 25 省選模擬賽 36分
暴力floyd20。因為只有yes和no還不是多組資料一起測的,rp分很足,no的概率極大所以都輸出了no,最後36,萬萬沒想到出題人lyb全都構的特殊資料,隔壁帆神報暴力之後全輸出yes90 正解 強連通縮點之後bitset優化的拓撲排序 60 空間不夠所以分塊之後才100。t2 垃圾破題看了也不...
省選模擬賽 project
最小割問題。建如下邊 s,i,ai 代表選用a語言編寫第i個專案 i,t,bi 代表選用a語言編寫第i個專案 其後注意要反向連邊 i,j,d 代表選用b語言編寫第i個專案,選用a語言編寫第j個專案 j,i,c 代表選用a語言編寫第i個專案,選用b語言編寫第j個專案 litc學長出的題,引文最小割題目...