Rt,之前写的太烂被学长怼了。后来大概按照第一篇题解的结构写了下。但是还是样例都过不了(
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#define fft(x) butterfly_shape[x]
#define int long long
using namespace std;
const int M=998244353;
const int gg=3;
const int ig=(M+1)/3;
int butterfly_shape[200300];
inline int qp(int a,int x){
int res=a,ans=1;
res%=M;
while(x){
if(x&1)ans=ans*res%M;
res*=res;
res%=M;
x>>=1;
}
return ans;
}
inline void upd(int n){
int l=1<<n;
for(int i=1;i<l;i++)
fft(i)=(fft(i>>1)>>1)|((i&1)<<(n-1));
}
struct pol{
int f[210000];
int len=0;
inline void NTT(int g,int len){
for(int i=0;i<len;i++)
if(i<fft(i))swap(f[i],f[fft(i)]);
for(int i=1;i<len;i<<=1){
int dwg=qp(g,(M-1)/(i<<1));
for(int st=0,le=i<<1;st<len;st+=le){
int buf=1;
for(int j=0;j<i;j++,buf=buf*dwg%M){
int a=f[st+j],b=f[st+i+j]*buf%M;
f[st+j]=(a+b)%M;
f[st+j+i]=(a-b+M)%M;
}
}
}
}
};
int n;
pol F,ANS,P;
inline void inv(int lim,pol &x){
if(lim==1){
ANS.f[0]=qp(x.f[0],M-2);
for(int i=0;i<n;i++)
cout<<(ANS.f[i]%M+M)%M<<" ";
cout<<endl;
return ;
}
inv((lim+1)/2,x);
int l=0,len=1;
while(len<(lim<<1))len<<=1,l++;
upd(l);
for(int i=0;i<len;i++)P.f[i]=0;
for(int i=0;i<lim;i++)P.f[i]=x.f[i];
P.NTT(gg,len);
ANS.NTT(gg,len);
for(int i=0;i<len;i++)ANS.f[i]=(2*ANS.f[i]-ANS.f[i]*ANS.f[i]%M*P.f[i]%M)%M;
ANS.NTT(ig,len);
for(int i=lim;i<len;i++)ANS.f[i]=0;
for(int i=0;i<n;i++)
cout<<(ANS.f[i]%M+M)%M<<" ";
cout<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;i++)
cin>>F.f[i];
inv(n,F);
for(int i=0;i<n;i++)
cout<<(ANS.f[i]%M+M)%M<<" ";
return 0;
}