-
定义
  \ \ \ \ \ \ \, 多项式(Polynomial)是代数学中的基础概念,是由称为未知数的变量和称为系数的常数通过有限次加减法、乘法以及自然数幂次的乘方运算得到的代数表达式。多项式是整式的一种。未知数只有一个的多项式称为一元多项式。
  \ \ \ \ \ \ \, 一个 n n n元多项式,也就是长度为 n n n的多项式 f f f,我们可以这样表达:
f = ∑ i = 0 n f i ⋅ x i f=\sum_{i=0}^{n}f_i\cdot x^i f=i=0∑nfi⋅xi
  \ \ \ \ \ \ \, 我们一般简写为:
f = ∑ i = 0 n f i f=\sum_{i=0}^{n}f_i f=i=0∑nfi
-
多项式的加减法
  \ \ \ \ \ \ \, 这个挺简单的,我们直接写吧:
  \ \ \ \ \ \ \, 对于一个长度为 n n n的多项式 f f f和长度为 m m m的多项式 g g g:
f + g = ∑ i = 0 n f i + ∑ i = 0 m g i = ∑ i = 0 m a x ( n , m ) f i + g i \begin{aligned}f+g&=\sum_{i=0}^{n}f_i+\sum_{i=0}^{m}g_i\\ &=\sum_{i=0}^{{\rm max}(n,m)}f_i+g_i\end{aligned} f+g=i=0∑nfi+i=0∑mgi=i=0∑max(n,m)fi+gi
f − g = ∑ i = 0 n f i − ∑ i = 0 m g i = ∑ i = 0 m a x ( n , m ) f i − g i \begin{aligned}f-g&=\sum_{i=0}^{n}f_i-\sum_{i=0}^{m}g_i\\ &=\sum_{i=0}^{{\rm max}(n,m)}f_i-g_i\end{aligned} f−g=i=0∑nfi−i=0∑mgi=i=0∑max(n,m)fi−gi
-
多项式的乘法(卷积)
  \ \ \ \ \ \ \, 多项式的卷积,我们还是对于上文中的两个函数 f f f和 g g g,这个地方不展开写挺不方便的,我们就展开吧:
f ⨂ g = ∑ i = 0 n f i ⋅ x i × ∑ i = 0 m g i ⋅ x i = ∑ v = 0 n + m f b ⋅ x b × g a ⋅ x a [ a + b = v ] = ∑ x = 0 n + m ∑ i = 0 v f i ⋅ g v − i ⋅ x v \begin{aligned}f\bigotimes g&=\sum_{i=0}^{n}f_i\cdot x^i\times \sum_{i=0}^{m}g_i\cdot x^i \\ &=\sum_{v=0}^{n+m}f_b\cdot x^b\times g_a\cdot x^a[a+b=v]\\&=\sum_{x=0}^{n+m}\sum_{i=0}^{v}f_i\cdot g_{v-i}\cdot x^v\end{aligned} f⨂g=i=0∑nfi⋅xi×i=0∑mgi⋅xi=v=0∑n+mfb⋅xb×ga⋅xa[a+b=v]=x=0∑n+mi=0∑vfi⋅gv−i⋅xv
  \ \ \ \ \ \ \, 计算的复杂度呢,是 O ( n 2 ) O(n^2) O(n2)的,可以用一些神奇算法优化成 O ( n log n ) O(n\log n) O(nlogn)的具体看这里:【求多项式卷积的变换】
-
多项式的除法
  \ \ \ \ \ \ \, 一个多项式除以一个多项式,就是乘以他的逆元。
  \ \ \ \ \ \ \, 多项式的逆元,是对于一个长度为 n n n的多项式 f f f,找到一个同样长度为 n n n的多项式 f i n v f_{inv} finv,使得:
f ⨂ f i n v ≡ 1 ( m o d x n ) f\bigotimes f_{inv}\equiv 1\ \ ({\rm mod}\ x^n) f⨂finv≡1 (mod xn)
  \ \ \ \ \ \ \, 这个 f i n v f_{inv} finv可以递归求解:
  \ \ \ \ \ \ \, 我们假设,我们已经求出了 f i n v ′ f'_{inv} finv′,满足:
f ⨂ f i n v ′ ≡ 1 ( m o d x ⌈ n 2 ⌉ ) f\bigotimes f'_{inv}\equiv 1\ \ \left({\rm mod}\ x^{\left\lceil\frac{n}{2}\right\rceil}\right) f⨂finv′≡1 (mod x⌈2n⌉)
  \ \ \ \ \ \ \, 可以得到,对于 f i n v f_{inv} finv是同样的:
f ⨂ f i n v ≡ 1 ( m o d x ⌈ n 2 ⌉ ) f\bigotimes f_{inv}\equiv 1\ \ \left({\rm mod}\ x^{\left\lceil\frac{n}{2}\right\rceil}\right) f⨂finv≡1 (mod x⌈2n⌉)
  \ \ \ \ \ \ \, 所以有:
f ⨂ f i n v ′ − f ⨂ f i n v ≡ 0 ( m o d x ⌈ n 2 ⌉ ) f\bigotimes f'_{inv}-f\bigotimes f_{inv}\equiv 0\ \ \left({\rm mod}\ x^{\left\lceil\frac{n}{2}\right\rceil}\right) f⨂finv′−f⨂finv≡0 (mod x⌈2n⌉)
f ⨂ ( f i n v ′ − f i n v ) ≡ 0 ( m o d x ⌈ n 2 ⌉ ) f\bigotimes (f'_{inv}-f_{inv})\equiv 0\ \ \left({\rm mod}\ x^{\left\lceil\frac{n}{2}\right\rceil}\right) f⨂(finv′−finv)≡0 (mod x⌈2n⌉)
f i n v ′ − f i n v ≡ 0 ( m o d x ⌈ n 2 ⌉ ) f'_{inv}-f_{inv}\equiv 0\ \ \left({\rm mod}\ x^{\left\lceil\frac{n}{2}\right\rceil}\right) finv′−finv≡0 (mod x⌈2n⌉)
  \ \ \ \ \ \ \, 两边同时平方:
( f i n v ′ − f i n v ) 2 ≡ 0 ( m o d x n ) (f'_{inv}-f_{inv})^2\equiv 0\ \ \left({\rm mod}\ x^{n}\right) (finv′−finv)2≡0 (mod xn)
f i n v ′ 2 + f i n v 2 − 2 f i n v ′ ⨂ f i n v ≡ 0 ( m o d x n ) f'^2_{inv}+f^2_{inv}-2f'_{inv}\bigotimes f_{inv}\equiv 0\ \ \left({\rm mod}\ x^{n}\right) finv′2+finv2−2finv′⨂finv≡0 (mod xn)
  \ \ \ \ \ \ \, 两边同时卷 f f f:
f ⨂ f i n v ′ 2 + f ⨂ f i n v 2 − 2 f ⨂ f i n v ′ f i n v ≡ 0 ( m o d x n ) f\bigotimes f'^2_{inv}+f \bigotimes f^2_{inv}-2f\bigotimes f'_{inv}f_{inv}\equiv 0\ \ \left({\rm mod}\ x^{n}\right) f⨂finv′2+f⨂finv2−2f⨂finv′finv≡0 (mod xn)
f ⨂ f i n v ′ 2 + f ⨂ f i n v ⨂ f i n v − 2 f ⨂ f i n v ⨂ f i n v ′ ≡ 0 ( m o d x n ) f\bigotimes f'^2_{inv}+f \bigotimes f_{inv}\bigotimes f_{inv}-2f\bigotimes f_{inv}\bigotimes f'_{inv}\equiv 0\ \ \left({\rm mod}\ x^{n}\right) f⨂finv′2+f⨂finv⨂finv−2f⨂finv⨂finv′≡0 (mod xn)
f ⨂ f i n v ′ 2 + f i n v − 2 f i n v ′ ≡ 0 ( m o d x n ) f\bigotimes f'^2_{inv}+f_{inv}-2f'_{inv}\equiv 0\ \ \left({\rm mod}\ x^{n}\right) f⨂finv′2+finv−2finv′≡0 (mod xn)
2 f i n v ′ − f ⨂ f i n v ′ 2 ≡ f i n v ( m o d x n ) 2f'_{inv}-f\bigotimes f'^2_{inv}\equiv f_{inv}\ \ \left({\rm mod}\ x^{n}\right) 2finv′−f⨂finv′2≡finv (mod xn)
  \ \ \ \ \ \ \, 我们发现是卷积的形式,只需要先计算出:
f ⨂ f i n v ≡ 1 ( m o d 1 ) f\bigotimes f_{inv}\equiv 1\ \ ({\rm mod}\ 1) f⨂finv≡1 (mod 1)
  \ \ \ \ \ \ \, 后面再递推上去求几次卷积就好了,显然,在上面的式子中:f i n v = i n v f 0 f_{inv}={\rm inv}f_{0} finv=invf0
  \ \ \ \ \ \ \, 复杂度是 O ( n log n ) O(n\log n) O(nlogn)的:
void Inv(int *a,int *b,int xn){
if(xn==1) {b[0]=power(a[0],mod-2);return;}
Inv((xn+1)>>1);
int L=0,n=1;
while(n<(xn<<1)) n<<=1,++L;
for(register int i=1;i<n;++i) R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
for(register int i=0;i<xn;++i) c[i]=a[i];
for(register int i=xn;i<n;++i) c[i]=0;
NTT(c,1,n);NTT(b,1,n);
for(register int i=0;i<=n;++i)
b[i]=1ll*(2-1ll*c[i]*b[i]%mod+mod)%mod*b[i]%mod;
NTT(b,-1,n);
for(register int i=xn;i<n;++i) b[i]=0;
}