若多项式F(x)F(x)F(x)的最高次数为nnn,则degF=n\deg F =ndegF=n
设FR(x)F_R(x)FR(x)表示将F(x)F(x)F(x)的系数反转,即FR(x)F_R(x)FR(x)的第iii次项系数为F(x)F(x)F(x)的第n−in-in−i次项系数。
多项式乘法(FFT(实数意义下)&NTT(模意义下))
FFT的板子
const double PI=acos(-1);
struct cpx
{
double r,i;
cpx(double r=0.0,double i=0.0):r(r),i(i){
}
cpx operator *(const cpx &a)const
{
return cpx(r*a.r-i*a.i,r*a.i+i*a.r);
}
cpx operator +(const cpx &a)const
{
return cpx(r+a.r,i+a.i);
}
cpx operator -(const cpx &a)const
{
return cpx(r-a.r,i-a.i);
}
};
void FFT(cpx *A,int n,int typ)
{
for(int i=1,j=0;i<n-1;i++)
{
for(int s=n;j^=s>>=1,~j&s;);
if(i<j) swap(A[i],A[j]);
}
for(int i=1;i<n;i<<=1)
{
cpx w1(cos(PI/i),typ*sin(PI/i));
cpx w(1,0);
for(int j=0;j<i;j++,w=w*w1)
for(int l=j,r=l+i;l<n;l+=(i<<1),r=l+i)
{
cpx tmp=w*A[r];
A[r]=A[l]-tmp;
A[l]=A[l]+tmp;
}
}
if(typ==-1)
{
for(int i=0;i<n;i++) A[i].r/=n;
}
}
NTT的板子
#define MO 998244353
#define G 3
int PowMod(int a,int b)
{
int ret=1;
while(b)
{
if(b&1) ret=1LL*a*ret%MO;
a=1LL*a*a%MO;
b>>=1;
}
return ret;
}
int W[30][2];
void NTTPre()
{
for(int i=1,t=0;i<MAXN;i<<=1,t++)
{
W[t][0]=PowMod(G,(MO-1)/(i<<1));
W[t][1]=PowMod(W[t][0],MO-2);
}
}
void NTT(int *A,int n,int typ)
{
for(int i=1,j=0;i<n-1;i++)
{
for(int s=n;j^=s>>=1,~j&s;);
if(i<j) swap(A[i],A[j]);
}
for(int i=1,t=0;i<n;i<<=1,t++)
{
int w1=W[t][typ],w=1;
for(int j=0;j<i;j++,w=1LL*w*w1%MO)
for(int l=j,r=l+i;l<n;l+=(i<<1),r=l+i)
{
int tmp=1LL*w*A[r]%MO;
A[r]=(A[l]-tmp+MO)%MO;
A[l]=(A[l]+tmp)%MO;
}
}
if(typ)
{
int inv=PowMod(n,MO-2);
for(int i=0;i<n;i++)
A[i]=1LL*A[i]*inv%MO;
}
}
多项式求逆
对于一个多项式A(x)A(x)A(x),如果存在B(x)B(x)B(x)满足degB≤degA\deg B\le \deg AdegB≤degA并且A(x)B(x)≡1mod  xnA(x)B(x)\equiv 1\mod x^nA(x)B(x)≡1modxn。
即B(x)≡A−1(x)mod  xnB(x)\equiv A^{-1}(x)\mod x^nB(x)≡A−1(x)modxn,称B(x)B(x)B(x)为A(x)A(x)A(x)在mod  xn\mod x^nmodxn的意义下的逆元。
如何求B(x)B(x)B(x)呢?
假设已经求出B′(x)≡A−1(x)mod  x⌈n2⌉B'(x)\equiv A^{-1}(x)\mod x^{\lceil \frac{n}{2} \rceil}B′(x)≡A−1(x)modx⌈2n⌉
则B(x)−B′(x)≡0mod  x⌈n2⌉B(x)-B'(x)\equiv 0\mod x^{\lceil \frac{n}{2} \rceil}B(x)−B′(x)≡0modx⌈2n⌉
两边同时平方有:B2(x)+B′2(x)−2B(x)B′(x)≡0mod  xnB^2(x)+B'^2(x)-2B(x)B'(x)\equiv 0\mod x^nB2(x)+B′2(x)−2B(x)B′(x)≡0modxn
两边同时乘A(x)A(x)A(x)有:B(x)+B′2(x)A(x)−2B′(x)≡0mod  xnB(x)+B'^2(x)A(x)-2B'(x)\equiv 0\mod x^nB(x)+B′2(x)A(x)−2B′(x)≡0modxn
即B(x)≡2B′(x)−B′2(x)A(x)mod  xnB(x)\equiv 2B'(x)-B'^2(x)A(x)\mod x^nB(x)≡2B′(x)−B′2(x)A(x)modxn
注意到平方的时候将模数也平方了,为什么模数也可以平方呢?
记F(x)=B(x)−B′(x)F(x)=B(x)-B'(x)F(x)=B(x)−B′(x),则F2(x)F^2(x)F2(x)在mod  xn\mod x^nmodxn后从000到n−1n-1n−1的每一项系数必然由F(x)F(x)