蒟蒻求条多项式
查看原帖
蒟蒻求条多项式
455490
Sharpsmile楼主2024/10/21 12:14

rt。虽然感觉这种东西不会有人帮忙qwq

但是我真的找不到错哪了。问了机房的人也没人找到。

WA on 9.


#include <bits/stdc++.h>
#define int long long
//#define double long double
#define p1(x) x.first
#define p2(x) x.second
#define i128  __int128_t
#define pii pair<int,int>
using namespace std;
const int M=167772161,g=3,ig=(M+1)/g;
const int MXN=4e5+10;
inline int rd(){
    int x=0;
    char w=getchar();
    while(w>'9'||w<'0')
        w=getchar();
    while(w<='9'&&w>='0')
        x=x*10+(w^48),w=getchar();
    return x;
}
inline int trs(string s,int M){
    int x=0;
    for(char w:s)
        x=(x*10+(w^48))%M;
    return x;
}
inline int qp(int a,int x){
    int res=1;
    while(x){
        if(x&1)res=res*a%M;
        a=a*a%M;
        x>>=1;
    }
    return res;
}
inline void add(int &x,int y){
    if((x+=y)>=M)x-=M;
}
inline int addv(int x,int y){
    if((x+=y)>=M)x-=M;
    return x;
}

inline int inv(int a){return qp(a,M-2);}
int rev[MXN];
int F[MXN],G[MXN];
int tf[MXN],tg[MXN];
int T=-1;
inline void upd(int n){
    int N=1,lim=-1;
    while(N<n)lim++,N<<=1;
    if(N==T)return ;
    for(int i=1;i<T;i++)
        rev[i]=0;
    T=N;
    for(int i=1;i<N;i++)
        rev[i]=(rev[i>>1]>>1)|((i&1)<<lim);
}
inline void NTT(int *f,int n,bool tp=0){
    int N=1;
    while(N<n)N<<=1;
    upd(N);
    for(int i=0;i<N;i++)
        if(rev[i]>i)swap(f[rev[i]],f[i]);
    for(int m=2;m<=N;m<<=1){
        int len=m>>1;
        int buf=qp(tp?ig:g,(M-1)/m);
        for(int i=0;i<N;i+=m){
            int T=1;
            for(int j=i;j<i+len;j++){
                int a=f[j],b=T*f[j+len]%M;
                f[j]=addv(a,b);
                f[j+len]=addv(a,M-b);
                T=T*buf%M;
            }
        }
        
    }
    const int IV=inv(N);
    if(tp)
        for(int i=0;i<N;i++)
            f[i]=f[i]*IV%M;

}
inline void TM(int *f,int n,int *g,int m,int *p,int u=-1){
    
    int N=1,lim=-1;
       while(N<=m+n)lim++,N<<=1;
    int LIM=N;
    if(u!=-1)LIM=u;
    for(int i=0;i<N;i++)
        tf[i]=f[i];
    for(int i=n+1;i<N;i++)
        f[i]=0;
    if(g!=f){
        for(int i=0;i<N;i++)
            tg[i]=g[i];
        for(int i=m+1;i<N;i++)
            g[i]=0;
    }
    NTT(f,N);
    if(g!=f)
    NTT(g,N);
    for(int i=0;i<N;i++)
        p[i]=f[i]*g[i]%M;
    NTT(p,N,1);
    
    if(f!=p)
    for(int i=0;i<N;i++)
        f[i]=tf[i],tf[i]=0;
    if(p!=g&&g!=f)
    for(int i=0;i<N;i++)
        g[i]=tg[i],tg[i]=0;
    for(int i=LIM;i<N;i++)p[i]=0;
}
inline void INV(int *f,int n,int *g){
    int N=1;
    g[0]=inv(f[0]);
    while(N<n){

        N<<=1;
        for(int i=0;i<(N<<1);i++)tf[i]=f[i];
        for(int i=N;i<(N<<1);i++)f[i]=0;
        NTT(f,N<<1);
        NTT(g,N<<1);
        for(int i=0;i<N<<1;i++)
            g[i]=g[i]*(2-g[i]*f[i]%M+M)%M;
        NTT(g,N<<1,1);
       for(int i=0;i<(N<<1);i++)f[i]=tf[i],tf[i]=0;
        for(int i=N;i<N<<1;i++)
            g[i]=0;
    }
    for(int i=0;i<N;i++)
        g[i]=(g[i]+M)%M;
    for(int i=n;i<N;i++)
        g[i]=0;
}
int P[MXN],Q[MXN];
inline void ITGL(int *f,int n,int c=0){
    for(int i=n+1;i>=1;i--)
        f[i]=f[i-1]*inv(i)%M;
    f[0]=c;
}
inline void DER(int *f,int n){
    for(int i=0;i<n;i++)
        f[i]=(i+1)*f[i+1]%M;
    f[n]=0;
}
int org[MXN],tmp[MXN];
inline void LN(int *f,int n,int *g){
    for(int i=0;i<n;i++)
        org[i]=f[i];
    INV(f,n,g);
    int c=f[0];
    if(c!=1&&c!=-M+1)exit(0);
    DER(f,n);
    TM(f,n-2,g,n-1,g,n);
    ITGL(g,n-1);
    g[n]=0;
    for(int i=0;i<n;i++)
    f[i]=org[i];
}
inline void EXP(int *f,int n,int *g){
    int N=1;
    g[0]=1;
    if(f[0]!=0)exit(0);
    while(N<n){
        N<<=1;
        LN(g,N,tmp);
        for(int i=0;i<(N<<1);i++)tf[i]=f[i];
        for(int i=N;i<(N<<1);i++)f[i]=0;
        
        for(int i=0;i<(N<<1);i++)
            add(tmp[i],M-f[i]);
            
        NTT(tmp,N<<1);
        NTT(g,N<<1);
        for(int i=0;i<(N<<1);i++)
            g[i]=g[i]*(1-tmp[i]+M)%M;
        NTT(g,N<<1,1);
        for(int i=0;i<(N<<1);i++)f[i]=tf[i],tf[i]=0;
        for(int i=0;i<(N<<1);i++)tmp[i]=0;
        for(int i=N;i<(N<<1);i++)
            g[i]=0;
    }
    for(int i=0;i<N;i++)
        g[i]=(g[i]+M)%M;
    for(int i=n;i<N;i++)
        g[i]=0;
}
int QPT[MXN];
inline void QP(int *f,int n,string k,int *g){
    int t=-1;
    int b=0;
    for(int i=0;i<n;i++)
        if(f[i]!=0){
            t=i;
            b=f[i];
            break;
        }
    int ivb=inv(b);
    if(t&&(k.size()>=6||t*trs(k,M)>=n)){
        for(int i=0;i<n;i++)g[i]=0;
        return ;
    }
    for(int i=t;i<=n;i++)
        g[i-t]=f[i]*ivb%M;
    LN(g,n,QPT);
    int kx=trs(k,M);
    for(int i=0;i<n;i++)
        QPT[i]=QPT[i]*kx%M;
    for(int i=0;i<2*n;i++)
        g[i]=0;
    EXP(QPT,n,g);
    b=qp(b,trs(k,M-1));
    int p=trs(k,M)*t;
    for(int i=n-1;i>=p;i--)
        g[i]=g[i-p]*b%M;
    for(int i=0;i<p;i++)
        g[i]=0;
        
}
int n,k;
int SF[MXN],SG[MXN];
int fac[MXN];
signed main(){
    ios::sync_with_stdio(0);
    // freopen("genshin.in","r",stdin);
    // freopen("genshin.out","w",stdout);
    cin>>n>>k;
    n++;
    fac[0]=1;
    for(int i=1;i<=n;i++)
    fac[i]=fac[i-1]*i%M;
    SF[1]=1;
    EXP(SF,n,SG);
    SG[0]--;
    memset(SF,0,sizeof(SF));
    QP(SG,n,to_string(k),SF);
    for(int i=0;i<n;i++)
    cout<<SF[i]*fac[i]%M*inv(fac[k])%M<<" ";
    cout<<endl;
    return 0;
}
2024/10/21 12:14
加载中...