給定 n≤1015,k≤220,k 是 2 的冪,求:
k∣i,0≤i≤n∑(in) 單位根反演
相當於就是求 f(x)=∑i=0n(in)xi=(x+1)n 的 k 的倍數項的係數和,單位根反演後等於 k1j=0∑k−1f(wjk)=k1j=0∑k−1(wjk+1)n
提交記錄
m 種物品,每種大小 ai,數量 bi,求裝滿大小爲 k∈[1,n] 的揹包的方案數。bi=0 表示無限。1≤ai<110000,0≤bi≤106,1≤n,m≤105
對 bi=0,有 Fi=1−xai1;對 bi=0,有 Fi=1−xai1−xai(bi+1)
答案的生成函數 G=∏Fi=exp∑lnFi
ln1−xai1−xai(bi+1)=ln(1−xai(bi+1))−ln(1−xai)
ln(1−x)=∑i=1∞−i1xi,所以 lnFi 是某些位置的倍數的形式,可以先求出每個位置的貢獻和,然後 O(nlnn) 求出 ∑lnFi。
提交記錄
多項式快速冪模板題,次數k≤9,n≤105,可以求導遞推,可以點值快速冪。
dalao題解
裏面的 fi,Δ=fi−1,Δ−1+(ai+i−Δ)∗fi−1,Δ
那麼 fn,Δ 相當於是有 n−Δ 個數的貢獻爲 ai+i,然後乘上按照 gi,j=gi−1,j−1−j∗gi−1,j 遞推得到的 gn,Δ
求 g 很像第二類斯特林數·列(就是)
提交記錄
n個點的樹,對每個k,求任選k個點,包含這k個點的最小連通塊大小之和。
n≤200000
連通塊邊數=點數-1,考慮每條邊對ansk的貢獻然後加上(kn)即可。
選k個點,某條邊i在這個最小連通塊中的方案數是 (kn)−(ksz)−(kn−sz)
假設以1爲根, ansk=n∗(kn)−(∑i=2n(kszi)+(kn−szi))
記 cnti=∑[szj==i]+[n−szj==i],那麼後面那個式子可以記爲 fk=∑i=1n−1(ki)∗cnti
組合數拆開得到 fk∗k!=∑i=1n−1i!⋅cnti∗(i−k)!1。翻轉後做卷積就可以了。
Code
LOJ討論全局板塊有題解
自述:
這是個前綴和的遞推形式,可以將 ∑i=1x−2f(k,i) 用 f(k,x−1)−(x−1)k 表示。
那麼f(k,x)=2f(k,x−1)+xk−(x−1)k
至少有一個關於x的k−1次多項式可以滿足這個遞推關係,但是不一定會有同時滿足 f(k,1)=1 的k次多項式。
構造g(k,x)=2g(k,x−1)−xk+xk−1
那麼 f(k,x)+g(k,x)=2(f(k,x−1)+g(k,x−1)),所以f(k,x)=2x−1(f(k,1)+g(k,1))−g(k,x)
那麼我們只需要找到一個滿足 g 的遞推關係的 k−1 次多項式,並求出 g(k,1) 和 g(k,x)
可以設出 g(k,0),然後由遞推關係推出 g(k,1...k),此時可以插值求 g(k,k) 建立 g(k,0) 的等式從而求解。而LOJ的題解給出了這樣一個恆等式:i=0∑k(−1)i(ik)g(k,i)=0
實際上,對任何≤k−1次的多項式 F(x),都有 ∑i=0k(−1)i(ik)F(i)=0,具體證明可以將 x=−1 代入2020聯合省選D1T2組合數問題中。
然後就解出了 g(k,0),遞推 g(k,1...k−1),然後拉格朗日插值求出 g(k,x) 即可。
複雜度 O(k)
Code
n∗m的棋盤,每行恰好放兩個石子,每列最多放兩個石子,求方案數。n≤2∗106,m≤1018
枚舉放了兩個石子的列的個數 k,記 Sk 爲恰有k列放了兩個石子的方案數,那麼有:
Ans=k=0∑n(km)(2n−2km−k)Sk
把行,列分別看做一排點,一個石子看做一條邊,那麼現在就是在二分圖中求:左邊有 n 個二度點,右邊有 k 個二度點、2n−2k 個一度點,連邊的方案數。
把二度點拆成一度點,任意連邊之後復原,可能會出現兩個二度點連了重邊的情況,枚舉重邊至少的條數進行容斥:
Sk=2n+k1i=0∑k(−1)i(in)(ik)i!2i∗(2n−2i)!
卷積一下就可以了。
Code
n個點的數,每個點有權值 ai,選出恰好 m 個不相鄰的點,快樂度爲權值之積,求所有方案的快樂度之和。
設 f[u][i][0/1] 表示 u 子樹內選 i 個點,u 不選/選 的快樂度之和。
重鏈剖分,輕兒子分治NTT捲起來,重鏈按照輕兒子大小之和帶權分治捲起來,要記錄頭尾有沒有選。
分析一下複雜度:
卷輕兒子時,分治一個小log,總共log次作輕兒子,NTT一個log,複雜度 O(nlog3n),前兩個 log 比較小。分治卷積可以用堆也可以直接分治,不影響複雜度。
卷重鏈時,按照全局平衡二叉樹的帶權分治方法,總的深度是一個log的,NTT一個log,複雜度 O(nlog2n)
說起來蠻簡單,實際細節想不清根本下不了手
說起來輕兒子捲起來轉移到父親的時候整體移位總複雜度是O(nlogn)的
看完別人的代碼(0.7h later)發現其實還是蠻簡單的