多項式題單

LOJ #556. 「Antileaf’s Round」咱們去燒菜吧

求混合揹包(某一體積的物品可能有無限個也可能有有限個),得到體積和爲1...n1...n的方案數。

熱身題。
如果一個體積爲vv的物品有無限個,那麼其關於體積的普通生成函數爲i=0xvi=11xv\sum_{i=0}x^{vi} = \frac 1{1-x^v}
如果一個體積爲vv的物品有KK個,那麼其關於體積的普通生成函數爲i=0Kxvi=1xv(K+1)1xv\sum_{i=0}^K x^{vi} = \frac {1-x^{v(K+1)}}{1-x^v}
將這些生成函數乘起來即可得到答案的生成函數。
發現總項數可能達到n2n^2不能直接上多項式乘法,可以考慮對每個式子取ln\ln求和後求exp\exp
ln(1x)\ln (1-x)泰勒展開可以得到爲i=1xii\sum_{i=1} \frac {-x^i}{i}
所以對於ln11xv=ln1xv=i=1xivi\ln \frac {1}{1-x^v} = - \ln 1-x^v = \sum_{i=1} \frac {x^{iv}}i
ln1xv(K+1)1xv=i=1xivii=1xiv(K+1)i\ln \frac {1-x^{v(K+1)}}{1-x^v} = \sum_{i=1} \frac {x^{iv}}i - \sum_{i=1} \frac {x^{iv(K+1)}}i
求出xivx^{iv}v=v0v=v_0的係數和後即可O(nlnn)O(n\ln n)求和得到ln\ln後的式子求和的生成函數。
代碼

LOJ #6055. 「from CommonAnts」一道數學題 加強版

社論
fk(x)=i=1x1fk(i)+xk,fk(1)=1f_k(x) = \sum_{i=1}^{x-1} f_k(i) + x^{k},f_k(1) = 1
這個式子是一個 nn階遞推,既不是齊次也不是線性。
我們可以化一下式子變成常係數非齊次線性遞推。
fk(x)=fk(x1)+(i=1x2fk(i)+(x1)k)+xk(x1)k=2fk(x1)+xk(x1)kf_k(x) = f_k(x-1) + (\sum_{i=1}^{x-2}f_k(i) + (x-1)^{k}) + x^k- (x-1)^k \\= 2f_k(x-1)+x^k-(x-1)^k
這是個一階常係數非齊次線性遞推。
我們知道如果是齊次的話,因爲這個遞推式只有一階,第nn項可以用遞推式的特徵根的nn次方之類用快速冪解決。
變成齊次的方法很簡單,
構造遞推式gk(x)=2gk(x1)xk+(x1)kg_k(x) = 2g_k(x-1)-x^k+(x-1)^k
所以(fk(x)+gk(x))=2(fk(x1)+gk(x1))(f_k(x)+g_k(x)) = 2(f_k(x-1) + g_k(x-1))
我們求的fk(x)=2x1(fk(1)+gk(1))gk(n)f_k(x)=2^{x-1}(f_k(1)+g_k(1))-g_k(n)
考慮到我們需要的gk(x)g_k(x)只需要滿足一個遞推式,發現有且僅有一個k1k-1次多項式gk(x)g_k(x)滿足這個方程。
也就是說gk(x)g_k(x)可以是一個k1k-1次多項式。
那麼我們只需要求出gk(0...k1)g_k(0...k-1)即可拉格朗日插值得到gk(n)g_k(n),從而算出fk(n)f_k(n)
分別求出 0...k0...kkk次方後,可以通過假設gk(0)g_k(0)遞推得到gk(k)g_k(k),然後通過拉格朗日插值得到gk(k)g_k(k)的另一個表達式,解出gk(0)g_k(0)即可。

Code

LOJ #6391. 「THUPC2018」淘米神的樹 / Tommy

社論
容易發現這個順序其實類似於樹的拓撲序反過來。
當兩個初始點重合的時候就是求樹的拓撲序計數。
經典結論:答案爲n!i in treeszi\frac {n!}{\prod_{i \ in \ tree} sz_i},其中szisz_i是以初始黑點爲根時ii的子樹的大小。
當兩個初始點不重合時,新建一個點ss,將初始點和ss連邊。
那麼我們將會得到一顆基環樹,枚舉環上的一條邊割掉,我們就可以把問題看做以ss爲初始黑點求樹的拓撲序計數。
考慮割掉的這條邊,它左右兩邊的點中一定恰好有一個是環上最後一個被染成紅色的點,所以對於一種情況有兩種可能的割邊(最後一個被染成紅色的點左右有兩條邊),所以最後答案要÷2\div2

在這裏插入圖片描述
然後在兩個初始黑點中選一個爲根求出每個點的子樹大小,其中兩個初始黑點間的鏈的每個點的子樹大小依次記爲c1,c2...cnc_1,c_2...c_n,再在左邊加一個c0=0c_0 = 0,注意這裏c1...cnc_1...c_n是遞增的。
那麼cicj|c_i - c_j|i>ji>j時的意義就是在jj+1j \rightarrow j+1這條鏈斷開時的ii的子樹大小。
i<ji < j時的意義就是在jj+1j \rightarrow j+1這條鏈斷開時的i+1i+1的子樹大小。
所以在斷開jj+1j \rightarrow j+1時的鏈上的sz=i!=jcicj\prod sz = \prod_{i != j}|c_i - c_j|,不在鏈上的預處理即可。
那麼我們只需要求j1i!=jcicj\sum_{j} \frac 1{\prod_{i != j}|c_i - c_j|},發現這個東西和多項式快速插值的第一部分一模一樣。
具體的設F(x)=jxcjF(x) = \prod_{j} |x - c_j|,有i!=jcicj=F(x)xcix=ci\prod_{i != j}|c_i - c_j| = \left. \frac {F(x)}{x-c_i}\right|_{x=c_i}
因爲F(ci)=(cici)=0F(c_i)=(c_i-c_i)=0用洛必達法則,有:
i!=jcicj=F(ci)\prod_{i != j}|c_i - c_j| = F(c_i)'
分治 FFTFFT後求導套多點求值即可。

Code

LOJ #6609. 無意識的石子堆 加強版

社論

容斥做法:
枚舉有具體kk列放了兩顆石子,具體的2n2k2n-2k列放了一顆石子的方案數爲SkS_k
ans=k=0n(mk)(mk2n2k)Skans = \sum_{k=0}^n \binom mk\binom {m-k}{2n-2k}S_k
SkS_k,考慮容斥掉同一行的兩顆石子不能在同一列這個限制。
Sk=12n+ki=0k(ni)(ki)(1)ii!2i(2n2i)!S_k = \frac 1{2^{n+k}}\sum_{i=0}^k \binom ni\binom ki(-1)^ii!2^i(2n-2i)!
這裏枚舉的ii是同一行的兩顆石子在同一列的次數。
統計時將同一行的兩個石子看做不同,放在同一列的兩個石子先後有順序,這樣統計2n2i2n-2i個石子放入剩下還空着的列時可以直接寫(2n2i)!(2n-2i)!,相對應的需要在外面÷2n÷2k\div 2^n \div 2^k(有kk列可以放兩個石子)。
i!i!表示這ii行都分別有兩個重合的石子,將他們分配給ii列的方案,2i2^i是因爲這兩個石子之間有順序。
Sk=n!k!2n+ki=0k1(ki)!(2)i(2n2i)!i!(ni)!S_k = \frac {n!k!}{2^{n+k}}\sum_{i=0}^k \frac 1{(k-i)!}\frac {(-2)^i(2n-2i)!}{i!(n-i)!}
就可以卷積求出SkS_k,然後直接求得答案了。
還有一種多項式expexp但是不寫expexp的推法,本質應該有點類似,具體可以看上面的博客。
Code

LOJ #6703. 小 Q 的序列

社論
dp1:fi,j=fi1,j+fi1,j1(ai+j)dp1:f_{i,j} = f_{i-1,j} + f_{i-1,j-1}(a_i+j)fi,jf_{i,j}表示前ii個數選了jj數的貢獻和。
發現這個dpdp不太會做。
換一下定義:fi,jf_{i,j}表示前ii個數選了iji-j個數的貢獻和。
dp2:fi,j=fi1,j1+fi1,j(ai+ij)=fi1,j1jfi1,j+fi1,j(ai+i)dp2:f_{i,j} = f_{i-1,j-1} + f_{i-1,j}(a_i+i-j) = f_{i-1,j-1} - jf_{i-1,j} + f_{i-1,j}(a_i+i)
考慮組合意義(和第二類斯特林數相似):對於每個ii我們有三種選擇,
不選,代價×(ai+i)\times (a_i+i),
選,加入前面jj個組中的一個,代價×(j)\times (-j)
選,新建一個組,代價無變化。
不選ii個的代價可以用分治FFTFFTi=1n(x+ai+i)\prod_{i=1}^n (x+a_i+i)
ii個的代價,可以先考慮選一組的指數生成函數是(ex1)-(e^{-x}-1)(ex1)(e^x-1)是非空集合帶標號的指數生成函數,我們這裏除了第一個數,別的數加入還需要×1\times -1,所以是(ex1)-(e^{-x}-1)
那麼選 ii個的代價的生成函數就是exp(1ex)\exp (1-e^{-x}),注意是指數生成函數還需要除階乘。
然後將選和不選的生成函數卷積一下求xnx^n項即可。
Code

LOJ #6247. 九個太陽

福利題快速冪模板題

單位根反演:1ki=0k1wkij=[kj]\frac 1k\sum_{i=0}^{k-1} w^{ij}_{k} = [k|j]
wkj=1w^j_{k} = 1時,即[kj][k|j]時,原式=kk=1=\frac kk = 1
否則原式=1wkkjk(1wkj)=0=\frac {1-w^{kj}_k}{k(1-w^j_k)} = 0

所以對於此題:i=0n[ki](ni)=1ki=0nj=0k1wkij(ni)\sum_{i=0}^n[k|i]\binom ni = \frac 1{k}\sum_{i=0}^n \sum_{j=0}^{k-1} w^{ij}_{k}\binom ni
=1kj=0k1i=0nwkij(ni)=1kj=0k1(1+wkj)n=\frac 1k \sum_{j=0}^{k-1}\sum_{i=0}^n w^{ij}_k\binom ni = \frac 1k\sum_{j=0}^{k-1}(1+w^{j}_k)^n
此題模數很友好,求出單位根後快速冪即可。
Code

LOJ #6289. 花朵

fu,i,0/1f_{u,i,0/1}表示uu子樹內選了ii個點,其中uu選沒選爲第三維的答案,
那麼樹鏈剖分後建出全局平衡二叉樹,對於虛兒子到父親的轉移即爲fuf_{u}的分治FFTFFT
對於重兒子到父親,對重鏈分治,對於每一邊求出gi,0/1,0/1g_{i,0/1,0/1}表示重鏈的某部分即下方的虛子樹,頭是否被選爲第二維,尾是否被選爲第三維。

對重鏈分治的時候可以按照下面子樹的szsz分治而非對半分治,可以優化常數。
O(nlog3n)O(n\log ^3n)很好證明。

但是有人說這樣寫是O(nlog2n)O(n\log^2n)
Code

LOJ #6363. 「地底薔薇」

F(x)=i=02(i2)xii!F(x) = \sum_{i=0} \frac {2^{\binom i2}x^i} {i!}有標號無向圖數量。
D(x)=ϑlnF(x)=[lnF(x)]xD(x) = \vartheta \ln F(x) = [\ln F(x) ']x即有根有標號聯通無向圖數量。
B(x)=i=1bi+1xii!B(x) = \sum_{i=1} \frac {b_{i+1} x^i}{i!}bib_iii個點的無根有標號點雙連通圖數量。
那麼一個有根有標號聯通無向圖的根節點周圍可以掛若干個包含根的點雙,掛一個大小爲i+1i+1的點雙,那麼除了根以外的ii個點,每個點刪去和該點雙其他點的連邊後的連通塊是一個有根有標號聯通無向圖。
D(x)=xexp[i=1bi+1D(x)ii!]=xexpB[D(x)]D(x) = x \exp [\sum_{i=1} \frac {b_{i+1}D(x)^i}{i!}] = x \exp B[D(x)]
假設G[D(x)]=xG[D(x)]=x即他們互爲複合逆。
那麼D(G(x))=G(x)expB[D(G(x))]D(G(x)) = G(x) \exp B[D(G(x))]
也即:x=G(x)expB(x)x = G(x) \exp B(x)
B(x)=lnxG(x)B(x) = \ln \frac {x}{G(x)}
lnD(x)x=C(x)\ln \frac {D(x)}x =C(x)
則有C(G(x))=lnxG(x)=B(x)C(G(x)) = \ln \frac {x}{G(x)} = B(x)
又根據擴展拉格朗日反演可以得到:
[xn]B(x)=[xn]C(G(x))=[xn1]C(x)xnnD(x)n=[xn1]C(x)n×(xD(x))n=[xn1]C(x)nexp(nlnD(x)x)=[xn1]C(x)exp(nC(x))n[x^n]B(x) = [x^n]C(G(x)) = [x^{n-1}] \frac {C(x)'x^n}{nD(x)^n} = [x^{n-1}] \frac{C(x)'}n \times (\frac {x}{D(x)})^n = [x^{n-1}] \frac {C(x)'}n\exp(-n \ln \frac {D(x)}x) = [x^{n-1}]\frac {C(x)'\exp(-nC(x))}n
首先可以看到
在這裏插入圖片描述
發現這個條件讓你可以直接多次拉格朗日反演求出大小S\in S的所有點雙連通圖的方案數,設他的生成函數爲C(x)C(x)
然後和點雙聯通圖計數一樣的方法設答案爲F(x)F(x)
那麼考慮包含根的點雙,把這些點雙的邊刪掉之後,所有的點都可以掛一個我們正在求的圖也即F(x)F(x),然後自由組合。
所以可以得到方程:
F(x)=xexpC(F(x))F(x) = x \exp C(F(x))
發現有:
F(x)expC(F(x))=x\frac {F(x)}{\exp C(F(x))} = x
所以F(x)F(x)xexpC(x)\frac x{\exp C(x)}互爲複合逆。
[xn]F(x)=[xn1]xnnxnexpC(x)n=[xn1]expnC(x)n[x^n]F(x) = [x^{n-1}]\frac {x^n}{n\frac {x^n}{\exp C(x)^n}} = [x^{n-1}]\frac {\exp nC(x)}n
Code

AtCoder - agc005_f Many Easy Problems

題意:對於k=1...nk = 1...n,求在樹上選kk個點的所有方案中,在這kk個點中某兩個點的最短路徑上的點數。
發現對於選kk個點,答案是一個連通塊,所以邊數==點數1-1,所以我們計算總邊數最後加上(nk)\binom nk即可。
對於一條邊(a,b)(a,b),它在這個連通塊內即代表這kk個點不在同一邊,假設一邊的大小爲szsz,則它在這個連通塊內的方案數爲(nk)(szk)(nszk)\binom nk - \binom {sz}k - \binom{n-sz}k
將組合數拆開k!×(szk)=sz!(szk)!k! \times \binom {sz}k= \frac {sz! } {(sz-k)!}
做一下差卷積即可將(szk)\binom {sz}k貢獻到每個kk

Code

Codeforces 1096G Lucky Tickets

0~9種有k種可用數字,求前n/2個數字和與後n/2個數字和相等的方案數
對一個最高次數爲99的多項式求它的10510^5次冪即可。
可以直接做1e61e6NTTNTT然後把每個點值快速冪後再NTTNTT回來即可。
也可以通過g=fk,g=kfk1fg = f^k , g' = kf^{k-1}f'得到gf=kgfg'f = kgf'
ngnf0=i=19kifignii=19(ni)figning_nf_0 = \sum_{i=1}^9 kif_ig_{n-i} - \sum_{i=1}^9 (n-i)f_ig_{n-i},f0=0f_0=0可以通過平移多項式解決。
從而O(81n)O(81n)得到g=fkg = f^k

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章