若多项式 F ( x ) F(x) F(x)的最高次数为 n n n,则 deg F = n \deg F =n degF=n
设 F R ( x ) F_R(x) FR(x)表示将 F ( x ) F(x) F(x)的系数反转,即 F R ( x ) F_R(x) FR(x)的第 i i i次项系数为 F ( x ) F(x) F(x)的第 n − i n-i n−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)满足 deg B ≤ deg A \deg B\le \deg A degB≤degA并且 A ( x ) B ( x ) ≡ 1 m o d    x n A(x)B(x)\equiv 1\mod x^n A(x)B(x)≡1modxn。
即 B ( x ) ≡ A − 1 ( x ) m o d    x n B(x)\equiv A^{-1}(x)\mod x^n B(x)≡A−1(x)modxn,称 B ( x ) B(x) B(x)为 A ( x ) A(x) A(x)在 m o d    x n \mod x^n modxn的意义下的逆元。
如何求 B ( x ) B(x) B(x)呢?
假设已经求出 B ′ ( x ) ≡ A − 1 ( x ) m o d    x ⌈ n 2 ⌉ B'(x)\equiv A^{-1}(x)\mod x^{\lceil \frac{n}{2} \rceil} B′(x)≡A−1(x)modx⌈2n⌉
则 B ( x ) − B ′ ( x ) ≡ 0 m o d    x ⌈ n 2 ⌉ B(x)-B'(x)\equiv 0\mod x^{\lceil \frac{n}{2} \rceil} B(x)−B′(x)≡0modx⌈2n⌉
两边同时平方有: B 2 ( x ) + B ′ 2 ( x ) − 2 B ( x ) B ′ ( x ) ≡ 0 m o d    x n B^2(x)+B'^2(x)-2B(x)B'(x)\equiv 0\mod x^n B2(x)+B′2(x)−2B(x)B′(x)≡0modxn
两边同时乘 A ( x ) A(x) A(x)有: B ( x ) + B ′ 2 ( x ) A ( x ) − 2 B ′ ( x ) ≡ 0 m o d    x n B(x)+B'^2(x)A(x)-2B'(x)\equiv 0\mod x^n B(x)+B′2(x)A(x)−2B′(x)≡0modxn
即 B ( x ) ≡ 2 B ′ ( x ) − B ′ 2 ( x ) A ( x ) m o d    x n B(x)\equiv 2B'(x)-B'^2(x)A(x)\mod x^n B(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),则 F 2 ( x ) F^2(x) F2(x)在 m o d    x n \mod x^n modxn后从