多项式练习笔记

蒟蒻初学多项式,主要参照卡老师洛谷题单,模板题就不放了

[ZJOI2014]力

比较常规的一个多项式套路,注意到二者下标差为定值,翻转其中一个多项式就可以转化为求卷积了
关于正负的处理可以将一个多项式复制一份,翻转后取相反数接在元多项式后

[AH2017/HNOI2017]礼物

注意到\(m\)很小,可以保留枚举增加的非负整数\(c\),于是问题只剩下了旋转
二者同时旋转显然没有意义,我们强制只旋转\(2\)号串
设旋转了\(t\)位,写出答案表达式

\[\sum_{i=1}^n x_i*y_{i+t} \]

做法就显然和上题一样了
多项式处理旋转匹配的思路好像很nb,又好像比较常规
CF755G PolandBall and Many Other Balls

差分与前缀和

手摸两组数据发先现与组合数有关
设答案为\(f\),对于前缀和

\[f_i=\sum_{j=1}^n a_j*C_k^{i-j} \]

对于差分

\[f_i=\sum_{j=1}^n (-1)^{i-j} *a_j *C_k^{i-j} \]

很显然是个卷积,还有一个问题,\(k\)的范围极大,导致C的计算比较复杂,不能用常规的阶乘和逆元求出
但是对于\(C\)的通项公式,我们可以通过递推的到同一行的\(C\),这样\(k\)的贡献等同于\(k%10045358091004535809\)
计算就比较方便了

【CSGRound2】开拓者的卓识

对于\(sum_{k,l,r}\)\(A_i(l \leq i\leq r)\) 的贡献次数为 \(C_{i-l+k-1}^{k-1}*C_{r-i+k-1}^{k-1}\)
可以将其理解为\(A_i\)所贡献的区间每次可以向左(右)拓展k次,每次拓展任意非负整数长度,要求拓展k次后共拓展了i-l(r-i)长
这显然是个求非负整数接的问题,就可以用组合数带出上面的式子,注意左右是分别独立的
就可以得到

\[sum_{k,1,r} =\sum_{i=1}^r C_{i+k-2}^{k-1} *C_{r-i+k-1}^{k-1} *A_i \]

然后又是NTT的板子题了

CF755G PolandBall and Many Other Balls

对于朴素的DP,设 \(dp_{i,j}\) 为前\(i\)个数已经取了\(j\)组的方案数
显然有转移方程:

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

显然其生成函数为

\[F_n(x)=(1+x)F_{n-1}(x)+xF_{n-2}(x) \]

于是就有:

\[\left[ \begin{matrix} F_n(x),F_{n-1}(x)\end{matrix} \right] \times \left[ \begin{matrix} 1+x,1 \\ x,0 \end{matrix} \right] =\left[ \begin{matrix} F_{n+1}(x),F_{n}(x)\end{matrix} \right] \]

然后就可以对于转移矩阵快速幂实现快速转移了,但这个做法有一定的局限性,比如下一道题

CF623E Transforming Sequence

首先,对于这道题每一位是等价的,每一位仅有已出现与未出现之分
还有一个非常基本的结论,\(n>k\)时无解
还是先考虑暴力的DP,设\(dp_{i,j}\)为前\(i\)个数,已经有\(j\)为出现了\(1\)
于是就有转移方程:

\[dp_{i,j}=\sum_{l=0}^k dp_{i-1,l} * 2^l * C_{j}^{l} \]

同理的

\[dp_{n+m,i}=\sum_{j=0}^i dp_{n,j} * dp_{m,i-j} * C_{i}^{j} * 2^{m*j} \]

对于\(i==j\)的情况即可得到倍增的转移方程,同时右侧是个卷积,用MTT做即可

CF773F Test Data Generation

首先进行奇偶分析,发现a序列必然全是偶数,且\(a_n/g\)必为奇数,\(n\)也必为奇数
由于\(a_n/g\)为奇数,不妨枚举\(g\)中2因子的个数,
于是问题转化为:在\([1,\frac {max_a}{2^i}]\)中取一个长度为奇数单调递增的序列,且最后一位是奇数
\(dp_{i,j}\)表示取了\(i\)个数,最大值为\(j\)的方案数(这个状态定义仅锁定了右侧的边界,不会记重)
然后又转移方程:

\[dp_{n+m,k}=\sum_{i=0}^k dp_{n,i}*dp_{m,k-i} \]

但是复杂度显然还是太大了,考虑优化
两位都具有卷积的性质,但第二维太大了,显然无法用多项式维护
所以优化方案基本出来了,第一维卷积,第二维倍增
为了方便统计答案,还需将dp数组的定义修改,为"最大值不超过\(j\)",同时还需多记录一维表示最大值为奇还是偶(1/0)
设新的\(DP\)数组为\(f\),可以容易的得到4条新的类似dp数组的转移方程(有点难敲)
若是正常来写记重是显然的,但是在倍增的意义下,不会记重
最后还有个trick,对于每个g的计算,下一个g都近似于当前g的两倍,可以在倍增的过程中记录答案,做法就少了一个log

【模板】分治 FFT

多项式求逆的做法很棒

CF553E Kyoya and Train

首先有一个比较朴素的\(O(nmt^2)\)的做法,由于时间这一维的存在导致图实际上是一个点数\(n*t\),边数\(m*t\)的DAG,可以DP
设第\(i\)个点关于时间的\(OGF\)(不太懂怎么表达,就是\(k\)次项的系数表示在\(k\)时间到达\(i\)的最小花费)为\(F_i(x)\)
可以发现一条边所代表的转移方程实际上是个卷积,但是在计算\(k\)次项系数需要知道所有点比\([0,k-1]\)的所有系数
于是使用分治FFT即可,时间复杂度\(O(mtlog^2t)\)

CF848E Days of Floral Colours

首先考虑朴素DP,发现由于有距离为2的点对导致dp好像并不满足无后效性原则
但是由于距离仅为2,不存在一直由距离为2的点对交错下去的情况,所以只要暴力考虑最后四个点的情况即可
同时因为完全对称,我们可以仅dp半环,因为各个颜色等价,我们尽在最后考虑选取的颜色
\(f_{i,j}\)表示前i个点用了j种颜色的方案数,对是否含相对(距离为n)的点对判断只需要比较i与j/2的关系
还有一个辅助数组\(g_{i}\)表示i个点中,不含相对点的方案数
转移方程:

\[g_i=g_{i-2}+g_{i-4} \]

\[dp_{i,j}=\sum_{k=0}^i [i+1\equiv k(mod 2)] dp_{k,j-\frac{i-k+1}{2}} * (g_{i-k-1}+g_{i-k-3}) \]

改变一下循环变量的意义,上述第2式可以写为:

\[dp_{i,j}=\sum_{k} dp_{i-2*j+2*k+1,k}*(g_{2*(j-k-1)} + g_{2*(j-k-3)}) \]

可以分两步分治NTT卷起来

UVA12298 Super Poker II

直接构造生成函数暴力NTT

posted @ 2021-07-26 09:37  Saltywater  阅读(137)  评论(0)    收藏  举报