rt,下载数据后发现本地秒出答案,交到洛谷上T成0分
/*多项式IN*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod = 998244353;
const int maxn = 1e6 + 10;
int G = 3,Gi;
int rk[maxn],A[maxn],c[maxn],dA[maxn],B[maxn],invA[maxn];/*A的导数*/
int qpow(int x,int y){
int ans = 1;
while(y){
if(y & 1) ans = 1ll * ans * x % mod;
x = 1ll * x * x % mod;
y >>= 1;
}
return ans;
}
int Der(int *a,int *b,int n){/*求导*/
for(int i = 1; i < n; ++i)
b[i-1] = 1ll * i * a[i] % mod;
b[n-1] = 0;
}
int InvDer(int *a,int *b,int n){/*积分*/
for(int i = 1; i < n; ++i)
b[i] = 1ll * a[i-1] * qpow(i,mod-2) % mod;
b[0] = 0;
}
int mul(int a,int b){
return 1ll * a * b % mod;
}
int drop(int a,int b){
a -= b;
return (a < 0)?a + mod:a;
}
int add(int a,int b){
a += b;
return (a >= mod)?a - mod : a;
}
void NTT(int *f,int type,int lim){
for(int i = 0; i < lim; ++i)
if(i > rk[i]) swap(f[i],f[rk[i]]);
for(int j = 1; j < lim; j <<= 1){
int Wn = qpow(type == 1?G:Gi,(mod - 1) / (j << 1));
for(int Len = j << 1,i = 0; i < lim; i += Len){
int w = 1;
for(int k = 0; k < j; ++k,w = 1ll * w * Wn % mod){
int x = f[i+k],y = 1ll * w * f[i+k+j] % mod;
f[i+k] = add(x,y);
f[i+k+j] = drop(x,y);
}
}
}
if(type == -1)
for(int i = 0,inv = qpow(lim,mod-2); i < lim; ++i)
f[i] = mul(f[i],inv);
}
void polyinv(int *f,int *g,int len){
if(len == 1){
g[0] = qpow(f[0],mod-2);
return;
}
polyinv(f,g,len >> 1);
int lim = 1;
int l = 0;
while(lim < len << 1) lim <<= 1,l++;
for(int i = 1; i <= lim; ++i)
rk[i] = (rk[i >> 1] >> 1) | ((i & 1) << (l - 1));
for(int i = 0; i < len; ++i)
c[i] = f[i];
for(int i = len; i <= lim; ++i)
c[i] = 0;
NTT(c,1,lim); NTT(g,1,lim);
for(int i = 0; i < lim; ++i)
g[i] = drop((2ll * g[i]),mul((mul(g[i],g[i])),c[i]));
NTT(g,-1,lim);
for(int i = len; i < lim; ++i) g[i] = 0;
}
void getIn(int *A,int *B,int n){
int lim = 1,l = 0;
while(lim < n) lim <<= 1,l++;
polyinv(A,invA,lim);
Der(A,dA,lim);
lim <<= 1,l++;
for(int i = 1; i < lim; ++i)
rk[i] = (rk[i >> 1] >> 1) | ((i & 1) << (l - 1));
NTT(dA,1,lim);
NTT(invA,1,lim);
for(int i = 0; i < lim; ++i)
dA[i] = mul(dA[i],invA[i]);
NTT(dA,-1,lim);
InvDer(dA,B,n);
}
int read(){
char ch = getchar();
int x = 0;
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9') x = x * 10 + ch - 48,ch = getchar();
return x;
}
int main(){
Gi = qpow(G,mod-2);
int n;
scanf("%d",&n);
for(int i = 0; i < n; ++i)
scanf("%d",&A[i]);
getIn(A,B,n);
for(int i = 0; i < n; ++i)
printf("%d ",B[i]);
return 0;
}