开荒,点个赞再走吧
2025-07-14 18:34:04
发布于:上海
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=500010,MLY=998244353,g=3;
int bit,tot,rev[maxn];
inline int power(int a,int b){
int ans=1;
while(b){
if(b&1)ans=1llansa%MLY;
a=1llaa%MLY;
b>>=1;
}
return ans;
}
inline void Init(int n){
for(bit=0;(1<<bit)<=(n<<1);++bit);tot=1<<bit;
for(int i=1;i<tot;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
}
inline void NTT(int a,int inv){
for(int i=0;i<tot;++i)
if(i<rev[i])
swap(a[i],a[rev[i]]);
for(int mid=1;mid<tot;mid<<=1){
int tmp=power(g,(MLY-1)/(mid<<1));
if(!~inv)tmp=power(tmp,MLY-2);
for(int i=0;i<tot;i+=mid<<1)
for(int j=0,w=1;j<mid;++j,w=1llwtmp%MLY){
int x=a[i+j],y=1lla[i+j+mid]w%MLY;
a[i+j]=(x+y)%MLY;a[i+j+mid]=(x-y+MLY)%MLY;
}
}
if(!~inv){
inv=power(tot,MLY-2);
for(int i=0;i<tot;++i)a[i]=1lla[i]inv%MLY;
}
}
inline void PolyMul(int F,int G,int n,int inv=0){
Init(n);
static int a[maxn],b[maxn];
for(int i=0;i<n;++i)a[i]=F[i],b[i]=G[i];
for(int i=n;i<tot;++i)a[i]=b[i]=0;
NTT(a,1);NTT(b,1);
for(int i=0;i<tot;++i){
if(inv)a[i]=b[i](2-1lla[i]b[i]%MLY+MLY)%MLY;
else a[i]=1lla[i]b[i]%MLY;
}
NTT(a,-1);
for(int i=0;i<n;++i)G[i]=a[i];
}
inline void PolyInv(int F,int G,int n){
if(n==1){
G[0]=power(F[0],MLY-2);
return;
}
PolyInv(F,G,(n+1)>>1);
PolyMul(F,G,n,1);
}
int invG[maxn],G[maxn],F[maxn],fac[maxn],invfac[maxn],n;
int main(){
scanf("%d",&n);
fac[0]=invfac[0]=1;
for(int i=1;i<=n;++i)fac[i]=1llfac[i-1]i%MLY;
invfac[n]=power(fac[n],MLY-2);
for(int i=n-1;i;--i)invfac[i]=invfac[i+1](i+1ll)%MLY;
for(int i=1;i<=n;++i)G[i]=1llpower(2,i(i-1ll)/2%(MLY-1))invfac[i]%MLY;G[0]=1;
PolyInv(G,invG,n+1);
for(int i=0;i<=n;++i)F[i]=(MLY-invG[i])%MLY;
F[0]=(F[0]+1)%MLY;
if(n>=1)puts("1");
if(n>=2)puts("-1");
for(int i=3;i<=n;++i){
int ans=1llfac[i-1]power(2,i(i-3ll)/2%(MLY-1))%MLYpower(1ll*F[i]*fac[i]%MLY,MLY-2)%MLY;
printf("%d\n",ans);
}
return 0;
}//gzj
这里空空如也
有帮助,赞一个