这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 | |||
2020-2021:teams:legal_string:jxm2001:多项式_3 [2020/08/25 09:59] jxm2001 |
2020-2021:teams:legal_string:jxm2001:多项式_3 [2020/08/25 12:43] (当前版本) jxm2001 |
||
---|---|---|---|
行 676: | 行 676: | ||
namespace Poly{ | namespace Poly{ | ||
const int G=3; | const int G=3; | ||
- | int rev[MAXN<<2],Wn[30][2]; | + | int rev[MAXN<<2],Pool[MAXN<<3],*Wn[30]; |
void init(){ | void init(){ | ||
- | int m=Mod-1,lg2=0; | + | int lg2=0,*pos=Pool,n,w; |
- | while(m%2==0)m>>=1,lg2++; | + | while((1<<lg2)<MAXN*2)lg2++; |
- | Wn[lg2][1]=quick_pow(G,m); | + | n=1<<lg2,w=quick_pow(G,(Mod-1)/(1<<lg2)); |
- | Wn[lg2][0]=quick_pow(Wn[lg2][1],Mod-2); | + | while(~lg2){ |
- | while(lg2){ | + | Wn[lg2]=pos,pos+=n; |
- | m<<=1,lg2--; | + | Wn[lg2][0]=1; |
- | Wn[lg2][0]=1LL*Wn[lg2+1][0]*Wn[lg2+1][0]%Mod; | + | _for(i,1,n)Wn[lg2][i]=1LL*Wn[lg2][i-1]*w%Mod; |
- | Wn[lg2][1]=1LL*Wn[lg2+1][1]*Wn[lg2+1][1]%Mod; | + | w=1LL*w*w%Mod; |
+ | lg2--;n>>=1; | ||
} | } | ||
} | } | ||
行 699: | 行 700: | ||
swap(f[i],f[rev[i]]); | swap(f[i],f[rev[i]]); | ||
int t1,t2; | int t1,t2; | ||
- | for(int i=1,lg2=0;i<n;i<<=1,lg2++){ | + | for(int i=1,lg2=1;i<n;i<<=1,lg2++){ |
- | int w=Wn[lg2+1][type]; | + | |
for(int j=0;j<n;j+=(i<<1)){ | for(int j=0;j<n;j+=(i<<1)){ | ||
- | int cur=1; | ||
_for(k,j,j+i){ | _for(k,j,j+i){ | ||
- | t1=f[k],t2=1LL*cur*f[k+i]%Mod; | + | t1=f[k],t2=1LL*Wn[lg2][k-j]*f[k+i]%Mod; |
f[k]=(t1+t2)%Mod,f[k+i]=(t1-t2)%Mod; | f[k]=(t1+t2)%Mod,f[k+i]=(t1-t2)%Mod; | ||
- | cur=1LL*cur*w%Mod; | ||
} | } | ||
} | } | ||
} | } | ||
if(!type){ | if(!type){ | ||
+ | reverse(f+1,f+n); | ||
int div=quick_pow(n,Mod-2); | int div=quick_pow(n,Mod-2); | ||
_for(i,0,n)f[i]=(1LL*f[i]*div%Mod+Mod)%Mod; | _for(i,0,n)f[i]=(1LL*f[i]*div%Mod+Mod)%Mod; |