100%AC
2026-04-09 16:50:44
发布于:浙江
3阅读
0回复
0点赞
#include<cstdio>
const int N=262150;
const int mod=998244353;
int fac[N],inv[N];
int ksm(int u,int v){
int res=1;
for(;v;v>>=1,u=1ll*u*u%mod)
if(v&1)res=1ll*res*u%mod;
return res;
}
inline void swap(int &u,int &v){int o=u;u=v;v=o;}
void pre(int u){
fac[0]=fac[1]=inv[0]=inv[1]=1;
for(int i=2;i<=u;i++)fac[i]=1ll*fac[i-1]*i%mod;
inv[u]=ksm(fac[u],mod-2);
for(int i=u-1;i>=2;i--)inv[i]=1ll*inv[i+1]*(i+1)%mod;
}
int f[N],g[N],c[N],rnk[N],n;
void Ntt(int *t,int opt,int len){
int g=3,g_=ksm(3,mod-2);
for(int i=0;i<len;i++)if(i<rnk[i])swap(t[i],t[rnk[i]]);
for(int i=1;i<len;i<<=1){
int wn=ksm(~opt?g:g_,(mod-1)/(i<<1));
for(int j=0,J=i<<1;j<len;j+=J){
int w=1;
for(int k=j;k<i+j;k++,w=1ll*w*wn%mod){
int r=1ll*w*t[i+k]%mod;
t[i+k]=(t[k]-r+mod)%mod;
t[k]=(t[k]+r)%mod;
}
}
}
if(~opt)return;
int ny=ksm(len,mod-2);
for(int i=0;i<len;i++)t[i]=1ll*t[i]*ny%mod;
}
void Inv(int Len,int *a,int *b){
if(Len==1){b[0]=ksm(a[0],mod-2);return;}
Inv((Len+1)>>1,a,b);
int len=1,_2=-1;
while(len<Len+Len)len<<=1,_2++;
for(int i=0;i<len;i++)rnk[i]=(rnk[i>>1]>>1)|((i&1)<<_2);
for(int i=0;i<Len;i++)c[i]=a[i];
for(int i=Len;i<len;i++)c[i]=0;
Ntt(c,1,len);Ntt(b,1,len);
for(int i=0;i<len;i++)
b[i]=1ll*(2-1ll*c[i]*b[i]%mod+mod)*b[i]%mod;
Ntt(b,-1,len);
for(int i=Len;i<len;i++)b[i]=0;
}
int main(){
scanf("%d",&n);
pre(n);
for(int i=0;i<=n;i++)g[i]=ksm(2,1ll*i*(i-1)/2%(mod-1));//得到g[i]
for(int i=0;i<=n;i++)g[i]=1ll*g[i]*inv[i]%mod;//这里就是g'[i]了
Inv(n+1,g,f);
for(int i=0;i<=n;i++)f[i]=(mod-f[i])%mod;
f[0]=(f[0]+1)%mod;//得到f'[i]
for(int i=0;i<=n;i++)f[i]=1ll*f[i]*fac[i]%mod;//得到f[i]
if(n>=1)puts("1");
if(n>=2)puts("-1");//特判这两个输出
for(int i=3;i<=n;i++)
printf("%d\n",1ll*fac[i-1]*ksm(2,1ll*i*(i-3)/2%(mod-1))%mod*ksm(f[i],mod-2)%mod);
//最后用路径总条数/图数量
}
求求了点赞吧
全部评论 1
三克油·1
1周前 来自 浙江
0













有帮助,赞一个