Fast Fourier Transform 分类: templates 2015-04-06 22:19 41人阅读 评论(0) 收藏
2015-04-06 22:19
381 查看
c++复数类太慢了。。。于是就自己写了一个。。。、
FFT是很有意思的算法,可以尝试自己去写写。
提交地址:http://uoj.ac/problem/34
本记录:http://uoj.ac/submission/13994
FFT流程 :
A−>a
B−>b
a∗b=c
c−>C
*大写字母表示系数表示法,小写字母表示点值表示法
时间复杂度:O(N∗log2N), 具体实现见《算法导论》
FFT是很有意思的算法,可以尝试自己去写写。
提交地址:http://uoj.ac/problem/34
本记录:http://uoj.ac/submission/13994
FFT流程 :
A−>a
B−>b
a∗b=c
c−>C
*大写字母表示系数表示法,小写字母表示点值表示法
时间复杂度:O(N∗log2N), 具体实现见《算法导论》
#include<map> #include<string> #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #include<cmath> #include<iostream> #include<algorithm> const int MAXN = 1e5+5,MAXM = 1e5+5; const double pi = acos(-1); struct complex{double x,yi; complex(double x = 0,double yi = 0):x(x),yi(yi){}}; complex operator + (const complex &a,const complex &b){return complex(a.x + b.x,a.yi + b.yi);} complex operator - (const complex &a,const complex &b){return complex(a.x - b.x,a.yi - b.yi);} complex operator * (const complex &a,const complex &b){return complex(a.x*b.x - a.yi*b.yi , a.x*b.yi + a.yi*b.x);} complex operator / (const complex &a,const double &b) {return complex(a.x/b,a.yi/b);} void FFT(complex *X,int n,int flag) { for(int i = 0; i < n; i++) { int p = 0, t = i; for(int j = 1; j < n; j <<= 1) p <<= 1, p |= (t&1), t >>= 1; if(i < p) std::swap(X[i], X[p]); } for(int m = 2; m <= n; m <<= 1) { complex wm = complex(cos((double)2*pi*flag/m), sin((double)2*pi*flag/m)); for(int i = 0 ; i < n; i += m) { complex wk = complex(1, 0); for(int j = 0; j < (m>>1); wk = wk*wm, j++) { complex u = X[i+j], t = wk*X[i+j+(m>>1)]; X[i+j] = u + t, X[i+j+(m>>1)] = u - t; } } } if(flag == -1) for(int i = 0; i < n; i++) X[i] = X[i]/n; } int main() { int l, N , n , m; static complex A[MAXN<<2] , B[MAXM<<2], C[(MAXN+MAXM)<<1]; #ifndef ONLINE_JUDGE freopen("FFT.in","r",stdin); freopen("FFT.out","w",stdout); #endif std::cin >> n >> m; l = n + m + 1, N = 1; while(N < l) N <<=1; for(int i = 0; i <= n; i++)scanf("%lf",&A[i].x); for(int i = 0; i <= m; i++)scanf("%lf",&B[i].x); FFT(A, N, 1);FFT(B, N, 1); for(int i = 0; i < N; i++) C[i] = A[i]*B[i]; FFT(C, N, -1); for(int i = 0; i < l; i++) printf("%d ", (int)(C[i].x+0.5)); #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }
相关文章推荐
- template 分类: templates 2015-08-08 13:55 7人阅读 评论(0) 收藏
- VMWARE Workstation 10 安装Ghost 版本WIN7解决办法 分类: Android其他 2015-05-13 19:34 41人阅读 评论(0) 收藏
- sgu 133 分类: sgu 2015-03-07 22:19 31人阅读 评论(0) 收藏
- android创建数据库(SQLite)保存图片示例ZZ 分类: Android数据存储 2015-03-22 09:58 41人阅读 评论(0) 收藏
- bzoj 2038 分类: bzoj templates 2015-03-26 20:28 41人阅读 评论(0) 收藏
- android 打开扬声器zz 分类: Android开发 2014-05-30 10:54 41人阅读 评论(0) 收藏
- Android SharedPreferences详解 分类: Android开发 2014-05-30 10:56 41人阅读 评论(0) 收藏
- rebuild hnoi省选集训 分类: templates 2015-03-28 15:30 42人阅读 评论(0) 收藏
- leetCode(52):Add Binary 分类: leetCode 2015-07-28 23:03 41人阅读 评论(0) 收藏
- NTT 分类: templates 2015-08-11 23:34 3人阅读 评论(0) 收藏
- NYOJ-206 矩形的个数 AC 分类: NYOJ 2013-12-29 22:19 265人阅读 评论(0) 收藏
- 四层和七层负载均衡 分类: 系统架构 2015-05-27 22:15 41人阅读 评论(0) 收藏
- sgu 183 分类: sgu 2015-03-08 11:09 41人阅读 评论(0) 收藏
- Travel hnoi省选集训 分类: templates 2015-03-31 22:06 46人阅读 评论(0) 收藏
- leetCode(41):Convert Sorted Array to Binary Search Tree 分类: leetCode 2015-07-17 17:03 95人阅读 评论(0) 收藏
- ios项目常用模板框架之UITabBar+Nav 分类: ios开发 2015-04-06 20:34 350人阅读 评论(0) 收藏
- UNIX 读书笔记01 分类: Linux 2015-05-27 22:20 41人阅读 评论(0) 收藏
- MD5+Salt安全浅析 分类: 软件插件学习 2015-05-08 11:34 41人阅读 评论(0) 收藏
- 欢迎使用CSDN-markdown编辑器 分类: 杂谈 2015-04-06 16:32 121人阅读 评论(0) 收藏
- iOS基础控件之UISegmentedControl 分类: ios开发 2015-04-06 16:53 321人阅读 评论(0) 收藏