```cpp
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define N 400003
#define reg register
#define p 998244353
using namespace std;
struct poly{
int t;
int a[N];
};
int rev[N],invv[N];
poly F;
inline void read(int &x);
void print(int x);
inline int power(int a,int t);
void NTT(poly &f,int type,int lim);
inline void qwqqq(poly f,poly g,poly &res,int lim);
inline void print_poly(poly f);
inline void clear(poly &f);
void reverse(poly &f);
poly multiply(poly f,poly g);
poly inverse(poly f);
poly logarithm(poly f);
poly integral(poly f);
poly derivative(poly f);
poly exponential(poly f);
poly add(poly f,poly g);
poly subtract(poly f,poly g);
poly devide(poly f,poly g);
poly mod(poly f,poly g,poly q);
signed main(){
int n;
read(n);
--n;
for(int i=0;i<=n;++i) read(F.a[i]);
F.t = n;
F = exponential(F);
print_poly(F);
return 0;
}
poly exponential(poly f){
int n = f.t;
if(n==0){
f.a[0] = 1;
return f;
}
poly h,g = f;
g.t >>= 1;
clear(g);
h = exponential(g); //exp
h.t = n;
g = logarithm(h); //ln
for(int i=0;i<=n;++i)
g.a[i] = (f.a[i]-g.a[i]+p)%p;
g.a[0] = (g.a[0]+1)%p;
g = multiply(h,g); //多项式乘法
g.t = n;
clear(g);
return g;
}
//以下是其它板子
inline void clear(poly &f){
for(reg int i=f.t+1;i<N;++i) f.a[i] = 0;
}
poly inverse(poly f){
int cur = 0,base,l = 0,lim,n;
base = 1;
lim = 2;
n = f.t;
poly g[2];
g[cur].a[0] = power(f.a[0],p-2);
while(base<=(n<<1)){
for(int i=1;i<=lim;++i)
rev[i] = (rev[i>>1]>>1)|((i&1)<<l);
cur ^= 1;
memset(g[cur].a,0,sizeof(g[cur].a));
for(reg int i=0;i<base;++i)
g[cur].a[i] = (g[cur^1].a[i]<<1)%p;
cur ^= 1;
qwqqq(g[cur],g[cur],g[cur],lim);
qwqqq(g[cur],f,g[cur],lim);
cur ^= 1;
for(int i=0;i<base;++i)
g[cur].a[i] = (g[cur].a[i]-g[cur^1].a[i]+p)%p;
base <<= 1,lim <<= 1;
++l;
}
g[cur].t = n;
clear(g[cur]);
return g[cur];
}
poly mod(poly f,poly g,poly q){
poly res;
int m = g.t;
f.t = m;
q.t = min(q.t,m);
clear(f),clear(g),clear(q);
res = subtract(f,multiply(q,g));
res.t = m-1;
clear(res);
return res;
}
poly devide(poly f,poly g){
poly q;
int n = f.t,m = g.t;
reverse(f),reverse(g);
g.t = f.t = n-m+1;
clear(f),clear(g);
q = multiply(f,inverse(g));
q.t = n-m;
reverse(q);
return q;
}
poly subtract(poly f,poly g){
int l = max(f.t,g.t);
for(reg int i=0;i<=l;++i)
f.a[i] = (f.a[i]-g.a[i]+p)%p;
return f;
}
poly add(poly f,poly g){
int l = max(f.t,g.t);
for(reg int i=0;i<=l;++i)
f.a[i] = (f.a[i]+g.a[i])%p;
return f;
}
void reverse(poly &f){
int l = f.t>>1;
for(reg int i=0;i<=l;++i)
swap(f.a[i],f.a[f.t-i]);
}
poly logarithm(poly f){
clear(f);
int m = f.t;
f = multiply(derivative(f),inverse(f));
f.t = m;
f = integral(f);
--f.t;
clear(f);
return f;
}
poly integral(poly f){
invv[1] = 1;
++f.t;
for(int i=2;i<=f.t;++i)
invv[i] = (ll)(p-p/i)*invv[p%i]%p;
for(reg int i=f.t;i>=1;--i)
f.a[i] = (ll)f.a[i-1]*invv[i]%p;
f.a[0] = 0;
return f;
}
poly derivative(poly f){
for(reg int i=0;i<f.t;++i)
f.a[i] = (ll)f.a[i+1]*(i+1)%p;
f.a[f.t] = 0;
return f;
}
inline void qwqqq(poly f,poly g,poly &res,int lim){
poly F,G;
memset(F.a,0,sizeof(F.a));
memset(G.a,0,sizeof(G.a));
for(int i=0;i<=(lim>>1);++i){
F.a[i] = f.a[i];
G.a[i] = g.a[i];
}
NTT(F,1,lim),NTT(G,1,lim);
for(int i=0;i<=lim;++i)
F.a[i] = (ll)F.a[i]*G.a[i]%p;
NTT(F,-1,lim);
int inv = power(lim,p-2);
for(int i=0;i<=lim;++i)
res.a[i] = (ll)F.a[i]*inv%p;
}
inline void print_poly(poly f){
for(int i=0;i<=f.t;++i){
print(f.a[i]);
putchar(' ');
}
putchar('\n');
}
poly multiply(poly f,poly g){
int n = f.t,m = g.t;
int inv,lim = 1,l = 0;
while(lim<=n+m){
lim <<= 1;
++l;
}
--l;
for(int i=1;i<=lim;++i)
rev[i] = (rev[i>>1]>>1)|((i&1)<<l);
NTT(f,1,lim),NTT(g,1,lim);
for(int i=0;i<=lim;++i)
f.a[i] = (ll)f.a[i]*g.a[i]%p;
NTT(f,-1,lim);
inv = power(lim,p-2);
for(int i=0;i<=lim;++i)
f.a[i] = (ll)f.a[i]*inv%p;
f.t = n+m;
return f;
}
void NTT(poly &f,int type,int lim){
for(int i=0;i<=lim;++i){
if(i>=rev[i]) continue;
swap(f.a[i],f.a[rev[i]]);
}
for(int mid=1;mid<lim;mid<<=1){
int rt = power(3,(p-1)/(mid<<1));
if(type==-1) rt = power(rt,p-2);
int r = mid<<1;
for(int j=0;j<lim;j+=r){
int w = 1;
for(int k=0;k<mid;++k){
int x = f.a[j+k];
int y = (ll)w*f.a[j+k+mid]%p;
f.a[j+k] = (x+y)%p;
f.a[j+k+mid] = ((x-y)%p+p)%p;
w = (ll)w*rt%p;
}
}
}
}
inline int power(int a,int t){
int res = 1;
while(t){
if(t&1) res = (ll)res*a%p;
a = (ll)a*a%p;
t >>= 1;
}
return res;
}
inline void read(int &x){
x = 0;
char c = getchar();
while(c<'0'||c>'9') c = getchar();
while(c>='0'&&c<='9'){
x = (x<<3)+(x<<1)+(c^48);
c = getchar();
}
}
void print(int x){
if(x>9) print(x/10);
putchar(x%10+'0');
}
```
by NaCly_Fish @ 2019-03-14 20:10:26
那个$t$表示多项式的次数
by NaCly_Fish @ 2019-03-14 20:11:42
stO%%%%dalao又来装弱了
by WYXkk @ 2019-03-14 20:12:07
orz巨佬怒切黑题
by AC_Automation @ 2019-03-14 20:12:29
枫姐姐太强辣Orz
by VenusM1nT @ 2019-03-14 20:15:29
@[Venus](/space/show?uid=23243) 云妹妹天天把我吊起来打QAQ
by NaCly_Fish @ 2019-03-14 20:16:36
咸鱼姐姐又切黑题了
by Loser_King @ 2019-03-14 20:17:01
@[NaCly_Fish](/space/show?uid=115864) “不到30行的代码”
by Le_temps_des_fleurs @ 2019-03-14 20:18:24
~~去你的萌新~~
by Le_temps_des_fleurs @ 2019-03-14 20:18:38
哪里没到$30$行了qwq
by wxy_god @ 2019-03-14 20:18:45