社区讨论
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 条回复,欢迎继续交流。
正在加载回复...