rt。
指的两种写法分别是:
第一种:
inline void NTT(int*f,int*p){
for(int i=0;i<n;++i)
if(rev[i]<i)
swap(f[i],f[rev[i]]);
for(int mid=1;mid<n;mid<<=1){
const int len=mid<<1,Base=p[n/len];
for(int i=0;i<n;i+=len){
int tx=1;
for(int j=0;j<mid;++j){
int l=i+j,r=l+mid;
int L=f[l],R=1ll*f[r]*tx%mod;
f[l]=mo(L+R),f[r]=mo(mod-R+L);
tx=1ll*tx*Base%mod;
}
}
}
}
第二种:
inline void NTT(int*f,int*p){
for(int i=0;i<n;++i)
if(rev[i]<i)
swap(f[i],f[rev[i]]);
for(int mid=1;mid<n;mid<<=1){
const int len=mid<<1,Base=p[n/len];
int tx=1;
for(int i=0;i<mid;++i){
for(int j=0;j<n;j+=len){
int l=i+j,r=l+mid;
int L=f[l],R=1ll*f[r]*tx%mod;
f[l]=mo(L+R),f[r]=mo(mod-R+L);
}
tx=1ll*tx*Base%mod;
}
}
}
其中两种写法唯一的区别在于里面两层循环的顺序的不同,按理来说,第二种写法的运算次数应该要少一些,但是第一种写法可以跑过【模板】A*B Problem升级版(FFT快速傅里叶),而第二种写法不能。(第二种写法跑第一个点本地测要3s)
有没有人可以解释一下吗?非常感谢!