玄关求调,码风良好

P4238 【模板】多项式乘法逆

过了 ```cpp #include<bits/stdc++.h> #define sf scanf #define pf printf using namespace std; typedef long long ll; const int N=4e5+3,mod=998244353; const int g=3; int re[N]; int a[N],b[2][N]; int n,lim,len; void reverse(int lim,int len){ for(int i=1;i<lim;i++) re[i]=(re[i>>1]>>1)|((i&1)<<(len-1)); } int add(int a,int b){ a=a+b; if(a>=mod) a-=mod; return a; } int ksm(int a,int b){ int s=1; while(b){ if(b&1) s=1ll*s*a%mod; a=1ll*a*a%mod; b>>=1; } return s; } void NTT(int *c,int lim,int type){ for(int i=0;i<lim;i++){ if(i<re[i]) swap(c[i],c[re[i]]); } for(int mid=1;mid<lim;mid<<=1){ int G=ksm(g,(mod-1)/(mid<<1)); if(type==-1) G=ksm(G,mod-2); for(int r=mid<<1,j=0;j<lim;j+=r){ int w=1; for(int i=0;i<mid;i++,w=1ll*w*G%mod){ int a=c[j+i],b=1ll*c[j+mid+i]*w%mod; c[j+i]=add(a,b); c[j+mid+i]=add(a,mod-b); } } } if(type==-1){ int inv=ksm(lim,mod-2); for(int i=0;i<lim;i++) c[i]=1ll*c[i]*inv%mod; } } void mul(int *a,int *b,int lim){ int A[N],B[N]; memset(A,0,sizeof(A)); memset(B,0,sizeof(B)); for(int i=0;i<lim;i++) A[i]=a[i],B[i]=b[i]; NTT(A,lim,1); NTT(B,lim,1); for(int i=0;i<lim;i++) A[i]=1ll*A[i]*B[i]%mod; NTT(A,lim,-1); for(int i=0;i<lim;i++) a[i]=A[i]; } int t[N]; void getinv(int *a,int &cur,int n){ b[cur][0]=ksm(a[0],mod-2); int bas=1,lim=2,len=1; while(bas<=(n<<1)){ reverse(lim,len); cur^=1; memset(b[cur],0,sizeof(b[cur])); for(int i=0;i<bas;i++){ b[cur][i]=add(b[cur^1][i]<<1,0); } mul(b[cur^1],b[cur^1],lim); for (int i = bas; i < lim; i ++ ) b[cur^1][i] = 0; std :: memset(t, 0, sizeof t); for (int i = 0; i < bas; i ++ ) t[i] = a[i]; mul(b[cur^1],t,lim); for(int i=0;i<bas;i++){ b[cur][i]=add(b[cur][i],mod-b[cur^1][i]); } bas<<=1,lim<<=1,++len; } } int main(){ sf("%d",&n); for(int i=0;i<n;i++) sf("%d",&a[i]); int cur=0; getinv(a,cur,n); for(int i=0;i<n;i++) pf("%d ",b[cur][i]); } /* 7 7 6 5 4 3 2 1 */ ```
by Aaron_Romeo @ 2024-04-27 16:59:36


@[txppdd](/user/542128) 原因是多项式乘法溢出了
by Aaron_Romeo @ 2024-04-27 17:01:00


@[Aaron_Romeo](/user/481106) /bx dalao 已关。
by txppdd @ 2024-05-03 16:56:46


|