多项式题单

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

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