求助
查看原帖
求助
160839
Prean楼主2020/8/1 13:27

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]);
}
2020/8/1 13:27
加载中...