覺得模擬賽題解還是單獨放出來比較好。
A.擠壓
好像不難?二進位制表示下的平方展開沒推出來,不然就成簡單題了。
首先我們需要知道對於一個數 \(x\),把它拆成 29 位的二進位制形式後,用 \(s_i\) 表示二進位制下第 \(i\) 位上的數,那麼其實這個數就是 \((\overline{s_{29} s_{28}...s_1 s_0})_2\),那麼有
那麼可以知道只有二進位制下兩位數同時為 1 時才會對答案有貢獻,這樣我們就可以列舉二進位制下的兩位 \(i,j\),在此基礎上迴圈整個序列設 \(f_{k,0/1,0/1}\) 表示前 \(k\) 個數的第 \(i,j\) 位選了奇/偶個的機率,最後計算上 \(f_{n,1,1}\) 對答案的貢獻即可。
注意第 \(k\) 個數選或不選的轉移有以下幾種情況:
-
二進位制下的這個數第 \(i,j\) 位都不為 1,那麼顯然它對答案,直接繼承就行;
-
第 \(i\) 位為 1 而 第 \(j\) 位不為 1,那麼若選這個數,則只有第 \(i\) 位的奇偶發生變化;反之同理;
-
\(i,j\) 位都為 1,選這個數時,\(i,j\) 兩位上的奇偶都發生變化,以此為例:
對於每一組 \(i,j\),初始化 \(f_{0,0,0}=0\) 即可。
B.工地難題
字首和最佳化:設 \(f_i\) 表示最長連續 1 的個數 \(num\le i\) 的方案數,顯然對於最長連續 1 的個數恰好等於 \(i\) 的答案就是 \(f_i-f_{i-1}\)。
現在我們考慮如何求 \(f_i\)。我們可以將題目理解為插板的形式:放好了 \(n-m\) 個 0,那麼現在有 \(n-m+1\) 個位置可以插入 1,每個位置上都可以放 \([0,m]\) 個 1,問方案數。
設 \(x_j\) 表示第 \(j\) 個位置放了幾個 1,那麼求 \(f_i\) 其實就是求 \(\sum_{j=1}^{n-m+1} x_j=m\) 的非負整數解的個數。簡單容斥一下就好了。