见鬼样例段错误求助
查看原帖
见鬼样例段错误求助
106738
_Felix楼主2021/1/22 15:01

今日活见鬼(1/inf)

得答复立删

在getln里RE,仔细一看,在getinv里RE,仔细一看,在getinv之前输出***,输出了,在getinv的脑袋上输出* 没输出。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+10,mod=998244353;
int len,lim;
int id[N],pre[N],G=3,invG=332748118;
inline int read(){
    char ch; ch=getchar();
    int num=0,fff=1;
    while(ch<'0'||ch>'9'){ if(ch=='-') fff=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') num=(num<<3)+(num<<1)+ch-'0',ch=getchar();
    return num*fff;
}
inline void write(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>=10) write(x/10);
    putchar(x%10+'0');
    return;
}
inline int Add(int x,int y){ x+=y; if(x>=mod) x-=mod; return x; }
inline int Sub(int x,int y){ x-=y; if(x<0) x+=mod; return x; }
inline int mul(int x,int y){ return 1ll*x*y%mod; }
inline int power(int a,int b){
    int ret=1;
    while(b){
        if(b&1) ret=mul(ret,a);
        b>>=1;a=mul(a,a);
    }
    return ret;
}
inline int inv(int x){ return power(x,mod-2); }
inline void getlim(int x){ len=0,lim=1; while(lim<x) lim<<=1,len++; }
inline void initid(){ for(int i=0;i<lim;i++) id[i]=(id[i>>1]>>1)|((i&1)<<(len-1)); }
void initpre(){
    for(int i=1;i<lim;i<<=1){
        int w=power(3,(mod-1)/(i<<1)); pre[i]=1;
        for(int j=1;j<i;j++) pre[i+j]=mul(pre[i+j-1],w);
    } 
}
void NTT(int *a,bool tp){
    for(int i=0;i<lim;i++) if(i<id[i]) swap(a[i],a[id[i]]);
    for(int mid=1,cnt=0;mid<lim;mid<<=1,cnt++)
        for(int j=0,len=mid<<1;j<lim;j+=len)
            for(int k=0;k<mid;k++){
                int x=a[j+k],y=mul(pre[mid+k],a[j+k+mid]);
                a[j+k]=Add(x,y); a[j+k+mid]=Sub(x,y);
            }
    if(tp) return;
    int invlim=inv(lim);
    for(int i=0;i<lim;i++) a[i]=mul(a[i],invlim);
    reverse(a+1,a+lim);
    return;
}
void getmul(int *A,int *B){
    initid();
    NTT(A,1); NTT(B,1);
    for(int i=0;i<lim;i++) A[i]=mul(A[i],B[i]);
    NTT(A,0);
    return;
}
void getinv(int *a,int *b){
    cout<<"*"<<endl;
    int c[N],m=lim;
    b[0]=inv(a[0]); //initpre();
    for(int step=2;step<m;step<<=1){
        getlim(step<<1); initid();
        for(int i=0;i<lim;i++) c[i]=(i<step)?a[i]:0;
        NTT(c,1); NTT(b,1);
        for(int i=0;i<lim;i++) b[i]=mul(Sub(2,mul(b[i],c[i])),b[i]);
        NTT(b,0);
        for(int i=step;i<lim;i++) b[i]=0;
    }
    return;
}
void getdao(int n,int *A,int *B){ B[n-1]=0; for(int i=1;i<n;i++) B[i-1]=mul(i,A[i]); }
void getjifen(int n,int *A,int *B){ B[0]=0; for(int i=1;i<n;i++) B[i]=mul(inv(i),A[i-1]); }
void getln(int n,int *a,int *b){
    int A[N],B[N]; getlim(n<<1); //initpre();
    getdao(n,a,A);
    cout<<"***"<<endl;
    getinv(a,B); 
    cout<<"***"<<endl;
    getmul(A,B); getjifen(n,A,b);
}
void getexp(int n,int *a,int *b){
    //B(x)={(1-\ln (B_0(x))+A(x)} ){B_0(x)}
    getlim(n<<1); initpre();
    int tmp[N],m=lim;
    b[0]=1; 
    for(int step=2;step<m;step<<=1){
        getlim(step<<1); initid(); getln(lim,b,tmp);
        cout<<step<<endl;
        for(int i=0;i<lim;i++) tmp[i]=(i>0)?Sub(a[i],tmp[i]):Sub(a[i]+1,tmp[i]);
        getmul(b,tmp);
        for(int i=step;i<lim;i++) b[i]=tmp[i]=0;
    }
    return;
}
int main(){
    int n,f[N],g[N];
    n=read();
    for(int i=0;i<n;i++) f[i]=read();
    getexp(n,f,g);
    for(int i=0;i<n;i++) write(g[i]),putchar(' ');  puts("");
    return 0;
}
2021/1/22 15:01
加载中...