模板——多项式
作者:互联网
多项式乘法
#include<bits/stdc++.h>
using namespace std;
const int N=(1<<18),P=998244353,G[2]={3,(P+1)/3};
int rv[N],gp[2][N],iv[N];
inline int fpw(int a,int x){
int s=1;
for(;x;x>>=1,a=1ll*a*a%P) if(x&1) s=1ll*s*a%P;
return s;
}
inline void dft(int* a,int n,int p){
for(int i=0;i<n;i++) if(i<rv[i]) swap(a[i],a[rv[i]]);
for(int i=1;i<n;i<<=1){
int wn=gp[p][i];
for(int j=0;j<n;j+=(i<<1)){
int w=1;
for(int k=0;k<i;k++,w=1ll*wn*w%P){
int& A=a[i+j+k],&B=a[j+k],t=1ll*w*A%P;
A=B-t; if(A<0) A+=P;
B=B+t; if(B>=P) B-=P;
}
}
}
if(p) for(int i=0;i<n;i++) a[i]=1ll*a[i]*iv[n]%P;
}
inline int poly_mul(int* A,int* B,int* C,int m){
int p=0,n=1;
while(n<=m) n<<=1,p++;
for(int i=0;i<n;i++) rv[i]=(rv[i>>1]>>1)|((i&1)<<(p-1));
dft(A,n,0); dft(B,n,0);
for(int i=0;i<n;i++) C[i]=1ll*A[i]*B[i]%P;
dft(C,n,1);
return n;
}
//C=A*B m:需要C的0-(m-1)项 n:返回C的项数
int main()
{
for(int i=1;i<N;i++) iv[i]=fpw(i,P-2);
for(int p=0;p<2;p++) for(int i=1;i<N;i<<=1) gp[p][i]=fpw(G[p],(P-1)/(i<<1));
return 0;
}
标签:std,a%,int,多项式,1ll,const,模板 来源: https://www.cnblogs.com/szsz/p/16525868.html