Exp 板子不过样例求调
查看原帖
Exp 板子不过样例求调
464732
luqyou楼主2025/1/31 19:43

RT,瞪了一天了

#include<bits/stdc++.h>
#define int long long
using namespace std;
#define fi first
#define sc second
#define pii pair<int,int>
#define pb push_back
#define umap unordered_map
#define mset multiset
#define pq priority_queue
#define ull unsigned long long
#define i128 __int128
const int mod=998244353,g=3;
const int maxn=1e6+10;
int n,rev[maxn],a[maxn],b[maxn],F[maxn],A[maxn],B[maxn],C[maxn];
int quickpow(int x,int y){
    int p=1;
    for(int i=y;i;i>>=1) p=(p*((i&1)?x:1))%mod,x=(x*x)%mod;
    return p;
}
int inv(int x){
    return quickpow(x,mod-2);
}
void ntt(int *f,int n,int p){
    for(int i=0;i<n;i++) rev[i]=((i&1)?(rev[i^1]|(n>>1)):(rev[i>>1]>>1));
    for(int i=0;i<n;i++) if(i<rev[i]) swap(f[i],f[rev[i]]);
    int wi,w,u,t;
    for(int i=1;(i<<1)<=n;i<<=1){
        w=quickpow(g,(mod-1)/(i<<1));
        if(p==-1) w=inv(w);
        for(int j=0;j<n;j+=(i<<1)){
            wi=1;
            for(int k=0;k<i;wi=(wi*w)%mod,k++){
                u=f[j+k],t=(wi*f[j+k+i])%mod,f[j+k]=(u+t)%mod,f[j+k+i]=(u-t+mod)%mod;
            }
        }
    }
    if(p==-1){
        w=inv(n);
        for(int i=0;i<n;i++) f[i]=(f[i]*w)%mod;
    }
}
void polyinv(int *f,int *g,int n){
    if(n==1) return g[0]=inv(f[0]),void();
    polyinv(f,g,n>>1);
    int l=(1<<(int)(log2(n)+1));
    for(int i=0;i<n;i++) F[i]=f[i];
    for(int i=n;i<l;i++) F[i]=0;
    for(int i=l>>1;i<n;i++) g[i]=0;
    ntt(F,l,1),ntt(g,l,1);
    for(int i=0;i<l;i++) g[i]=(mod+2-F[i]*g[i]%mod)*g[i]%mod;
    ntt(g,l,-1);
    for(int i=n;i<l;i++) g[i]=0;
}
void polyder(int *f,int *g,int n){
    g[n-1]=0;
    for(int i=0;i<n-1;i++) g[i]=(f[i+1]*(i+1))%mod;
}
void polyint(int *f,int *g,int n){
    g[0]=0;
    for(int i=1;i<n;i++) g[i]=(f[i-1]*inv(i))%mod;
}
void polyln(int *f,int *g,int n){
    polyder(f,A,n),polyinv(f,B,n);
    int l=(1<<(int)(log2(n)+1));
    for(int i=n;i<l;i++) A[i]=B[i]=0;
    ntt(A,l,1),ntt(B,l,1);
    for(int i=0;i<l;i++) A[i]=(A[i]*B[i])%mod;
    ntt(A,l,-1),polyint(A,g,n);
}
void polyexp(int *f,int *g,int n){//g=g(1-ln g+f);
    if(n==1) return g[0]=1,void();
    int l=(1<<(int)(log2(n)+1));
    polyexp(f,g,n>>1),polyln(g,C,n);
    for(int i=0;i<n;i++) C[i]=(f[i]-C[i]+mod)%mod;
    C[0]++,ntt(g,l,1),ntt(C,l,1);
    for(int i=0;i<l;i++) g[i]=(g[i]*C[i])%mod;
    ntt(g,l,-1);
    for(int i=n;i<l;i++) g[i]=C[i]=0;
}
void solve(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    int l=(1<<(int)(log2(n)+1));
    polyexp(a,b,l);
    for(int i=0;i<n;i++) cout<<b[i]<<" ";
    cout<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--) solve();
    return 0;
}
2025/1/31 19:43
加载中...