多项式相关笔记
一.生成函数
1.BZOJ3771
构造$f(x)=\sum x^{a[i]}$那么选一个数的答案就是$f(x)$
选两个数需要去掉选同一个数的情况,发现这部分竟然可以被表示为$x^{2a[i]}$。那么答案是$(f^{2}(x)-f(x^{2}))/2$
选三个数需要去掉两种情况
1.一个数选三次,贡献是$f(x^{3})$
2.两个数一个一次一个两次,$f^{2}(x)f(x^{2})$,但选一次的数是第几次选不确定,因此要乘3,又由于这部分还包含了一个数选三次的情况,在计算结果时要加回来。
那么答案是$(f^{3}(x)-3f^{2}(x)f(x^{2})+2f(x^{3}))/6$
三部分加起来就行了
二.FFT原理
跟胡小兔的博客学的,胡小兔真滴强
FFT的原理大致分为以下几个步骤:
朴素多项式乘法是O(n^{2})的
1.点值表示
对于一个$n-1$阶多项式,我们可以在这个多项式的图像上取$n$个不同的点$(x,y)$,那么这$n$个点唯一地表示出这个多项式
引用兔犇犇的话:“即只有一个多项式能同时满足“代入这些$x$,得到的分别是这些$y$”。”
考虑把多项式换成点值表示
假设有两个多项式$A,B$,取n个不同的x,分别计算出它们在A,B中对应的y值$A(x_{i})$和$B(x_{i})$,这样就得到A,B两个多项式的点值表示了
设多项式$C=A*B$,那么$C(x_{i})=A(x_{i})*B(x_{i})$
由此可见两个点值表示的多项式合并成一个新的点值多项式的时间是$O(n)$的!
然而取n个x并分别计算出y值的时间是$O(n^{2})$的,并且新的点值表示还原成多项式的插值算法同样是$O(n^{2})$的,这就需要优化了
2.单位根优化
利用复数的神奇性质
先假设n是2的整数次幂,如果不是就在后面补上0
胡小兔博客里证明的非常简洁明了,我就不证了
可以将点值表示和插值还原多项式两个过程进行分治,优化为nlogn