CSP-S模擬賽20241004

Lunar_Whisper發表於2024-10-04

A

你考慮 可以把這個陣列當中的每個數表示成另一種形式:\(a_i = k_i\times x+b\)(其中\(x\)是模數,\(b\)為餘數)。

對於求兩個數是否對於某個餘數同餘,顯然你要判斷他們兩個的差,即\(a_i-a_j\),那麼我們用上面那種形式表示其實就是\(a_i-a_j = (k_i-k_j) \times x\),所以你要判斷整個陣列的話只需要對每兩個數的差求一個\(gcd\),如果這個\(gcd\)\(1\),顯然,他們所有數不能對一個數同餘,故選擇的模數直接用\(2\)就可以讓模出來最少的餘數種類---僅有\(2\)種,否則的話,就可以透過餘某個數把他們變成同餘的,故答案就是\(1\)

Code

B

場切的第一個第二題哈哈哈哈,首先你考慮這個如果做數學的話沒法推到出來一個大的綜合式子(別問為什麼,兩個小時沒做出來)。
我們考慮做\(dp\)計數,設定\(dp_{i,j}\)表示當前選到了第\(i\)個數,當前的和為\(j\)
那麼考慮轉移,其實挺好整,你考慮如果這一個選\(1\),那麼他能從\(dp_{i-1,j-1}\)轉移過來。
如果選了\(j\)這個和,那麼你考慮其實\(j/2\)的也能選到,因為你可以把這個序列當中的所有數都除以\(2\),所以也可以轉移。

注意,建議你正著列舉,也就是:

\[dp_{i,j} = dp_{i-1,j-1}+dp_{i,j*2} \]

那麼這個時候,你對於\(j\)的列舉順序應該是從大到小的,因為你在計算\(j\)的時候會找到\(j*2\)對吧,所以在第二維計算的時候,他是具有依賴性的哈哈哈。
記得判斷\(j*2\)的範圍一定是 \(\le i\)的。

D

考慮容斥把問題轉化。
設定\(f_i\)表示至少欽定了\(i\)個數的出現次數不大於\(1\)\(g_i\)表示你恰好欽定了\(i\)個數的出現次數不大於\(1\)
得到公式:

\[f_i = \sum_{i=0}^{n}C_{j}^{i} g_j \]

反演得到:

\[g_i = \sum_{i=0}^{n}(-1)^{j-i}C_{j}^{i}f_j \]

解釋一下這裡為什麼有組合數奧,顯然,一開始你欽定了\(i\)個數,對於你目前找到的這\(j\)個數,有\(C_{j}^{i}\)種選法。

但是,你\(f_i\)的表示還需要有一個\(C_{n}^{i}\),這是為什麼呢?因為你在求這個\(f_i\)時一開始點的選擇有\(C_{n}^{i}\)種選法,當你欽定了這\(i\)個數的時候,你還有\(C_{j}^{i}\)種可以移動的方法,這樣可以理解吧。

那麼你發現,答案其實就是\(g_0\),顯然啊!

對於欽定的\(i\)個元素,可以分為兩類:出現一次的和沒有出現的。對於沒有出現過的元素可以不考慮,對於只出現一次的元素,設其個數為\(j\),可以考慮將其劃分為若干集合,然後再與未欽定的元素進行搭配。將相互區分的\(n\)個元素劃分為\(k\)個不互相區分的非空集合方案數為\(\displaystyle {k \brace n}\)