多项式乘法 FFT模板
生活随笔
收集整理的這篇文章主要介紹了
多项式乘法 FFT模板
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目傳送門
在下只是來存?zhèn)€板子,,(板子還是洛谷找的2333)
證明的話,太(wo)難(bu)寫(hui),就先留個(gè)坑吧,,,
NOIP后,如果沒退役,我會回來填坑的,,
#include<bits/stdc++.h> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<deque> #include<list> #include<set> #include<vector> #include<iostream> #define ll long long #define re register #define inf 0x7f7f7f7f #define inl inline #define sqr(x) (x*x) //#define eps 1e-8 #define debug printf("debug\n"); //#pragma comment(linker, "/STACK:1024000000,1024000000") //#pragma GCC optimize (2) //#pragma G++ optimize (2) using namespace std; //const ll mod; const double Pi=acos(-1.0); const ll MAXN=1e7+10; inl ll read() {re ll x = 0; re int f = 1;char ch = getchar();while(ch<'0'||ch>'9') { if(ch== '-' ) f = -1; ch = getchar(); }while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x * f; } inl char readc() {char ch=getchar();while(('z'<ch||ch<'a')&&('Z'<ch||ch<'A')) ch=getchar();return ch; } inl void write(re ll x){if(x>=10)write(x/10);putchar(x%10+'0'); } inl void writeln(re ll x){if(x<0) {x=-x;putchar('-');}write(x); puts(""); } inl ll gcd(re ll x,re ll y){while(y^=x^=y^=x%=y);return x;} inl ll Lcm(re ll a,re ll b) {return a/gcd(a,b)*b;} inl void FR() {freopen(".in","r",stdin);freopen(".out","w",stdout); } inl void FC() {fclose(stdin);fclose(stdout); } struct cmplex{double x,y;cmplex (double xx=0,double yy=0) {x=xx;y=yy;}cmplex operator + (const cmplex &ch) const {return cmplex(x+ch.x,y+ch.y);} cmplex operator - (const cmplex &ch) const {return cmplex(x-ch.x,y-ch.y);} cmplex operator * (const cmplex &ch) const {return cmplex(x*ch.x-y*ch.y,x*ch.y+y*ch.x);} }a[MAXN],b[MAXN]; ll n,m,l,r[MAXN],limit=1; inl void fft(cmplex *a,ll type) {for(re ll i=0;i<limit;i++) {if(i<r[i]) swap(a[i],a[r[i]]);}//要迭代序列 for(re ll mid=1;mid<limit;mid<<=1) {cmplex Wn(cos(Pi/mid),type*sin(Pi/mid));//單位根 for(re ll R=mid<<1,j=0;j<limit;j+=R) {//R區(qū)間長,枚舉到j(luò) cmplex w(1,0);//冪 for(re ll k=0;k<mid;k++,w=w*Wn) {//左半部分 cmplex x=a[j+k],y=w*a[j+mid+k];a[j+k]=x+y;a[j+mid+k]=x-y;}}} } int main() { // FR();n=read(),m=read();for(re ll i=0;i<=n;i++) a[i].x=read();for(re ll i=0;i<=m;i++) b[i].x=read();while(limit<=n+m) limit<<=1,l++;for(re ll i=0;i<limit;i++) {r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));}//特殊處理奇數(shù) fft(a,1);fft(b,1);for(re ll i=0;i<=limit;i++) a[i]=a[i]*b[i];fft(a,-1);for(re ll i=0;i<n+m;i++) {write((ll)(a[i].x/limit+0.5));putchar(' ');}writeln((ll)(a[n+m].x/limit+0.5)); // FC();return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/20020723YJX/p/9490659.html
總結(jié)
以上是生活随笔為你收集整理的多项式乘法 FFT模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络流题目详讲+题单(提高版)(持续更新
- 下一篇: 日常维护经验