NTT求多项式逆元nlogn
用分治FFT是nlogn^2
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
#define g 3
#define p 998244353
int a[N],b[N],c[N],n,tot,bit,r[N];
int qpow(int a,int b){
int ans=1;
while(b){
if(b&1)ans=(ans*a)%p;
b/=2;
a=(a*a)%p;
}
return ans;
}
void NTT(int a[],int inv){
for(int i=0;i<tot;i++){
if(i<r[i])swap(a[i],a[r[i]]);
}
for(int mid=1;mid<tot;mid*=2){
int w1=qpow(g,(p-1)/(mid*2));
if(inv==-1)w1=qpow(w1,p-2);
for(int i=0;i<tot;i+=mid*2){//枚举每一块
int wk=1;
for(int j=0;j<mid;j++,wk=(wk*w1)%p){//枚举块内
int x=a[i+j];
int y=a[i+j+mid]*wk%p;
a[i+j]=(x+y)%p;
a[i+j+mid]=(x-y+p)%p;
}
}
}
if(inv==1)return;
//要除以tot等价于×tot的逆元
int t=qpow(tot,p-2);
for(int i=0;i<tot;i++)a[i]=(a[i]*t)%p;
}
void get_inv(int a[],int b[],int deg){
if(deg==1){
b[0]=qpow(a[0],p-2);
return;
}
get_inv(a,b,(deg+1)/2);
for(tot=1,bit=0;tot<=(deg*2);tot*=2,bit++);
for(int i=0;i<tot;i++){
r[i]=(r[i>>1]>>1)|((i&1)?(tot>>1):0);
if(i<deg)c[i]=a[i];
else c[i]=0;
}
NTT(c,1),NTT(b,1);
for(int i=0;i<tot;i++)b[i]=((2-c[i]*b[i])%p+p)*b[i]%p;
NTT(b,-1);
fill(b+deg,b+tot,0);
}
signed main(){
ios::sync_with_stdio(0);
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
get_inv(a,b,n);
for(int i=0;i<n;i++)cout<<b[i]<<' ';
}