社区讨论

NTT求助卡常

P3803【模板】多项式乘法(FFT)参与者 8已保存回复 30

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
30 条
当前快照
1 份
快照标识符
@lobq4pg8
此快照首次捕获于
2023/10/30 01:07
2 年前
此快照最后确认于
2023/11/04 05:44
2 年前
查看原帖
过了倒是过了,但是连最优解的最后一页都进不去,按理说ntt应该比fft快啊?但是不少fft跑的都比我的快。。。我该加的预处理什么的都加了啊?快读快写也都加了。。。
CPP
#include<stdio.h>
#include<ctype.h>
char buf[1<<21],*p1=buf,*p2=buf;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*(p1++))
inline void read(int&x){
    char c=getc();
    for(;!isdigit(c);c=getc());
    for(x=0;isdigit(c);c=getc())x=x*10+(c^48);
}
char obuf[1<<21];int o_p=-1;
inline void flush(){fwrite(obuf,1,o_p+1,stdout),o_p=-1;}
inline void putc(const char &c){if(o_p==(1<<21)-1)flush();obuf[++o_p]=c;}
void print(const int&x){if(x>9)print(x/10);putc((x%10)^48);}
constexpr int p=998244353,wn[24]={1,998244352,911660635,372528824,929031873,452798380,922799308,781712469,476477967,166035806,258648936,584193783,63912897,350007156,666702199,968855178,629671588,24514907,996173970,363395222,565042129,733596141,267099868,15311432};
int rev[2097152],n,m,t,l,A[2097152],B[2097152],omega[2097152]={1};
void NTT(int a[],int op){
    for(int i=1;i<t;++i)if(i<rev[i]){int t=a[i];a[i]=a[rev[i]];a[rev[i]]=t;}
    for(int i=1;i<t;i<<=1){
        for(int j=0;j<t;j+=(i<<1))
            for(int k=j;k<j+i;++k){int x=a[k],y=(long long)omega[k-j?(op?t-t/(i<<1)*(k-j):t/(i<<1)*(k-j)):0]*a[k+i]%p;a[k]=p-x>y?x+y:y-(p-x);a[k+i]=x<y?p-(y-x):x-y;}
    }
}
int main(){
    read(n),read(m);
    for(int i=0;i<=n;++i)read(A[i]);
    for(int i=0;i<=m;++i)read(B[i]);
    t=n+m+1;l=(t&-t)==t?__builtin_ctz(t):32-__builtin_clz(t);t=1<<l;
    for(int i=1;i<t;++i)rev[i]=(i&1)<<l-1|rev[i>>1]>>1;
    for(int i=1;i<t;++i)omega[i]=(long long)omega[i-1]*wn[l]%p;
    NTT(A,0);NTT(B,0);
    for(int i=0;i<t;++i)A[i]=(long long)A[i]*B[i]%p;
    NTT(A,1);int inv=(long long)(p-1)*(p-1)/t%p;
    for(int i=0;i<=n+m;++i)print((long long)A[i]*inv%p),putc(' ');
    flush();
    return 0;
}

回复

30 条回复,欢迎继续交流。

正在加载回复...