码迷,mamicode.com
首页 > 其他好文 > 详细

【UOJ】【34】多项式乘法

时间:2015-01-18 19:42:15      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

快速傅里叶变换模板题

算法理解请看《算法导论》第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 }
View Code

 

【UOJ】【34】多项式乘法

标签:

原文地址:http://www.cnblogs.com/Tunix/p/4232109.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!