sb的多项式写错了,求 帮忙康康/kel
bjd为什么输出的后面三个都是0。。。
#include<cstring>
#include<cstdio>
const int M=262149<<2,mod=167772161,G=3,invG=55924054;
int f[M],t[M],inv[M],fac[M],ifac[M];
inline void swap(int&a,int&b){
a^=b^=a^=b;
}
inline int pow(int a,int b=mod-2){
int ans=1;
for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;
return ans;
}
void NTT(int*f,bool flag,int n){
int i,k,p,w,w1,len;
for(i=0;i<n;++i)if(i<t[i])swap(f[i],f[t[i]]);
for(p=2;p<=n;p<<=1){
len=p>>1;w1=pow(flag?G:invG,(mod-1)/p);
for(k=0;k<n;k+=p){
w=1;
for(i=k;i<k+len;++i){
int t=1ll*f[i]*w%mod;
if((f[i+len]=f[i]-t)<0)f[i+len]+=mod;
if((f[i]=f[i]+t)>=mod)f[i]-=mod;
w=1ll*w*w1%mod;
}
}
}
if(flag)return;
int invn=pow(n);
for(i=0;i<n;++i)f[i]=1ll*f[i]*invn%mod;
}
void Solve(int*f,int n){
if(n==1)return void(f[0]=1);
static int g[M],buf[M];
int i,p,m=n+(n&1),len=1;
Solve(f,n+1>>1);
while(len<(n<<1))len<<=1;
memcpy(g,f,len<<2);p=1;
for(i=0;i<n;++i)g[i]=1ll*g[i]*fac[i]%mod;
for(i=n-1;i>=0;--i)buf[i]=1ll*p*ifac[n-i-1]%mod,p=1ll*p*m%mod;
for(i=0;i<len;++i)t[i]=t[i>>1]>>1|(i&1?n>>1:0);
NTT(g,1,len);NTT(buf,1,len);
for(i=0;i<len;++i)g[i]=1ll*g[i]*buf[i]%mod;
NTT(g,0,len);
for(i=0;i<len;++i)g[i]=1ll*g[i]*ifac[i]%mod;
NTT(f,1,len);NTT(g,1,len);
for(i=0;i<len;++i)f[i]=1ll*f[i]*g[i]%mod;
NTT(f,0,len);memset(f+n,0,len-n);
}
signed main(){
int i,n;
inv[1]=fac[0]=fac[1]=ifac[0]=ifac[1]=1;
scanf("%d",&n);
for(i=2;i<=n;++i){
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
ifac[i]=1ll*ifac[i-1]*inv[i]%mod;
fac[i]=1ll*fac[i-1]*i%mod;
}
Solve(f,n);
for(i=0;i<=n;++i)printf("%d ",f[i]);
}