省選模擬賽 厭世者打擊 60分

2022-05-01 06:15:10 字數 1387 閱讀 3450

分析:碼死我了這道題......

第一次用矩陣樹定理+高斯消元做題. 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學長出的題,引文最小割題目...