首页 > 代码库 > 【UOJ】【34】多项式乘法
【UOJ】【34】多项式乘法
快速傅里叶变换模板题
算法理解请看《算法导论》第30章《多项式与快速傅里叶变换》,至于证明插值唯一性什么的看不懂也没关系啦~只要明白这个过程是怎么算的就ok。
递归版:(4252ms 23468kb)
1 //UOJ 34 递归版 2 #include<cmath> 3 #include<vector> 4 #include<cstdio> 5 #include<cstring> 6 #include<cstdlib> 7 #include<complex> 8 #include<iostream> 9 #include<algorithm>10 #define rep(i,n) for(int i=0;i<n;++i)11 #define F(i,j,n) for(int i=j;i<=n;++i)12 #define D(i,j,n) for(int i=j;i>=n;--i)13 using namespace std;14 const int N=256256;15 void read(int &v){16 v=0;int sign=1; char ch=getchar();17 while(ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) sign=-1; ch=getchar();}18 while(ch>=‘0‘&&ch<=‘9‘){v=v*10+ch-‘0‘; ch=getchar();}19 v*=sign;20 }21 /****************tamplate***********************/22 const double PI=acos(-1);23 typedef complex<double> comp;24 comp a[N],b[N],c[N];25 void FFT(comp a[],int n,int type){26 if (n==1) return;27 int i;28 comp y0[n>>1],y1[n>>1];29 for(int i=0;i<n;i+=2)30 y0[i>>1]=a[i],y1[i>>1]=a[i+1];31 FFT(y0,n>>1,type); FFT(y1,n>>1,type);32 comp w0( cos(type*2*PI/n) , sin(type*2*PI/n) ), w(1,0);33 for(i=0;i<(n>>1);i++,w*=w0)34 a[i]=y0[i]+w*y1[i],a[i+(n>>1)]=y0[i]-w*y1[i];35 }36 int main(){37 int i,temp,n,m;38 read(n); read(m);39 int x;40 F(i,0,n) read(x),a[i].real()=x;41 F(i,0,m) read(x),b[i].real()=x;42 for(temp=1;temp<=m+n;temp<<=1);43 FFT(a,temp,1); FFT(b,temp,1);44 rep(i,temp) c[i]=a[i]*b[i];45 FFT(c,temp,-1);46 for(int i=0;i<=m+n;++i)47 printf("%d ",int(c[i].real()/temp+0.5));48 puts("");49 return 0;50 }
【UOJ】【34】多项式乘法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。