抄的 FFT 和 NTT 模板

2021-09-28 12:03:23 字數 3507 閱讀 4045

洛谷p1919 : 

fft :

#include#include#include#includeconst int n=1e6+10;

const double pi=acos(-1.0);

struct cp ;

} cp friend operator - (cp a,cp b) ;

} cp friend operator * (cp a,cp b) ;

}} a[n],b[n];

int r[n];

int lim,n,m;

int l;

int cnta,cntb;

void fft(cp *l,double f)

fft(a,1.00);

fft(b,1.00);

for(int i=0; i<=lim; i++)

fft(a,-1.00);

for(int i=0; i<=n+m; i++)

int f=0;

for(int i=n+m+1;i>=0;i--)

return 0;

}

ntt :

#include#define ll long long 

using namespace std;

const int maxn=2e6+10;

const int mod=998244353; //使用ntt需要保證模數mod 為質數

const ll pr=3;

//3是998244353的原根,在比賽中請用上面那個演算法提前算出....

ll f1[maxn],f2[maxn],u,v;

ll wn[50],r[maxn],n,m,n,m,l;

ll power(ll bs,ll js)

return s;

}void getwn()

int f=0;

for(int i=n+m+1;i>=0;i--)

return 0;

}

洛谷p3803 : 

fft :

#include#include#include#includeconst int n=1e7+10;

const double pi=acos(-1.0);

struct cp ;

} cp friend operator - (cp a,cp b) ;

} cp friend operator * (cp a,cp b) ;

}} a[n],b[n];

int r[n];

int lim,n,m;

int l;

int cnta,cntb;

void fft(cp *l,double f)

fft(a,1.00);

fft(b,1.00);

for(int i=0; i<=lim; i++)

fft(a,-1.00);

for(int i=0; i<=n+m; i++)

return 0;

}

ntt :

#include#define ll long long 

using namespace std;

const int maxn=1e7+10;

const int mod=998244353; //使用ntt需要保證模數mod 為質數

const ll pr=3;

//3是998244353的原根,在比賽中請用上面那個演算法提前算出....

ll f1[maxn],f2[maxn],u,v;

ll wn[50],r[maxn],n,m,n,m,l,ans[maxn];

ll power(ll bs,ll js)

return s;

}void getwn()

ntt配套的求原根演算法:

#include#define ll long long

#define il inline

#define rg register

using namespace std;

ll prm[1000],tot,n,root;

ll power(ll bs,ll js,ll mod) return s;

}il ll getroot(rg ll n)

}if(tmp != 1)prm[++tot] = tmp; //質因數分解

for(rg ll g = 2; g <= n-1; g ++)

}if(flag)return g;

}return 0; //無解

}int main();

}cp friend operator - (cp a,cp b) ;

}cp friend operator * (cp a,cp b) ;

}} a[n],b[n];

ll r[n];

int lim,n,m;

int l;

int a[n];

ll num[n],sum[n];

void fft(cp *l,double f)

fft(a,1.00);

for(int i=0; i<=lim; i++)

fft(a,-1.00);

for(int i=0;i<=len+len;i++)

for(int i=0;i2019 上海網路賽 : 

#include#define ll long long

using namespace std;

const int n=4e5+10;

const double pi=acos(-1.0);

struct cp ;

} cp friend operator - (cp a,cp b) ;

} cp friend operator * (cp a,cp b) ;

}} a[n],b[n];

ll r[n],sum[n],ans;

int lim,n,m,cnta,cntb,cntc;

int l;

int aa[n],bb[n],cc[n],a[n],b[n],c[n];

void fft(cp *l,double f)

fft(a,1.00);

fft(b,1.00);

for(int i=0; i<=lim; i++)

fft(a,-1.00);

for(int i=1; i<=c[n-1]; i++) sum[i]=(ll)(a[i].x/lim+0.5)+sum[i-1];

ans=0;

for(int i=0; ifor(int i=0; ifor(int i=0; ireturn ans;

}int main() else

} return 0;

}

模板 FFT與NTT高精度乘法模板

fft高精度乘法 與ntt高精度乘法 搞得不甚明了,不予解釋 fft include include include includeusing namespace std const int maxn 300000 const double pi 3.1415926535 typedef compl...

任意模數ntt 模板篇 NTT和三模數NTT

之前寫過fft的筆記.我們知道fft是在複數域上進行的變換.而且經過數學家的證明,dft是複數域上唯一滿足迴圈卷積性質的變換.而我們在oi中,經常遇到對 x取模的題目,這就啟發我們可不可以在模運算的意義下找乙個這樣的變換.然後我們發現有個神奇的東西,原根 g 這東西在模意義下相當於單位復根 e 所以...

多項式的基本運算 FFT和NTT 總結

設參與運算的多項式最高次數是n,那麼多項式的加法,減法顯然可以在o n 時間內計算。所以我們關心的是兩個多項式的乘積。樸素的方法需要o n 2 時間,並不夠優秀。考慮優化。方案一 分治乘法。對於多項式x,y,假設各有2m項,即最高次數是2m 1 x,y分別可以用兩個含m項的多項式來表示,即 則由此可...