其他分享
首页 > 其他分享> > 模板——多项式

模板——多项式

作者:互联网

多项式乘法

#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