快速傅里叶变换模板题

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

迭代版:(1228ms 48088kb)(空间浪费了,其实用不了这么大)

 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=1000086;
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 int n,m;
26 void FFT(comp *a,int n,int type){
27     for(int i=1,j=0;i<n-1;i++){//j初始为i-1的位逆序置换?……每次算出i的位逆序置换j,下一次从j开始找(二进制加法)
28         //只改变1~n-2,0和n-1位置不变
29         for(int s=n;j^=s>>=1,~j&s;);//
30         if (i<j) swap(a[i],a[j]);
31     }
32     for(int m=1;m<n;m<<=1){
33         double u=pi/m*type; comp wm(cos(u),sin(u));
34         for(int k=0;k<n;k+=(m<<1) ){
35             comp w(1,0);
36             for(int j=0;j<m;j++){
37                 comp &A=a[k+j+m],&B=a[k+j],t=w*A;
38                 A=B-t; B=B+t; w=w*wm;
39             }
40         }
41     }
42     if (type==-1) rep(i,n) a[i].real()/=n;
43 }
44
45 int main(){
46 #ifndef ONLINE_JUDGE
47     freopen("FFT.in","r",stdin);
48 #endif
49     read(n); read(m);
50     int k=0;
51     for(k=1;k<=n||k<=m;k<<=1); k<<=1;
52     int x;
53     F(i,0,n) read(x),a[i].real()=x;
54     F(i,0,m) read(x),b[i].real()=x;
55     FFT(a,k,1); FFT(b,k,1);
56     rep(i,k) c[i]=a[i]*b[i];
57     FFT(c,k,-1);
58     F(i,0,n+m) printf("%d ",int(c[i].real()+0.5));
59     return 0;
60 }

View Code

位逆序置换:(orz trz爷)(27~30行)

TRZ:比如我们要把一个二进制数加一,不是从最低位开始找到一个0,把它变成1,它之后的都变0嘛?那么现在我们有了i的位逆序表示,要求i+1的,不就是从最高位找0嘛,那个循环就是干这个事的。

转载于:https://www.cnblogs.com/Tunix/p/4232109.html

【UOJ】【34】多项式乘法相关推荐

  1. UOJ #34. 多项式乘法

    #34. 多项式乘法 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 ...

  2. UOJ #34 多项式乘法

    这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,分别表示第一个多项式的 00 到 nn  ...

  3. 解题报告(二)多项式问题(多项式乘法及其各种运算)(ACM/ OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  4. 【数字信号处理】卷积编程实现 ( Matlab 卷积和多项式乘法 conv 函数 | 使用 matlab 代码求卷积并绘图 )

    文章目录 一.Matlab 卷积和多项式乘法 conv 函数 二.使用 matlab 代码求卷积并绘图 一.Matlab 卷积和多项式乘法 conv 函数 Matlab 文档地址 : https:// ...

  5. 求幂运算、多项式乘法及Horner法则的应用

    一,两种不同的求幂运算 求解x^n(x 的 n 次方) ①使用递归,代码如下: 1 private static long pow(int x, int n){ 2 if(n == 0) 3 retu ...

  6. PAT甲级1009 Product of Polynomials:[C++题解]多项式乘法、高精度乘法

    文章目录 题目分析 题目链接 题目分析 多项用一个数组来表示,数组下标表示多项式的次幂,存的内容表示多项式的系数. 然后用两重循环来计算多项式的乘法: for i : 第二个式子for j:第一个式子 ...

  7. 洛谷 - P3803 【模板】多项式乘法(FFT/NTT)

    题目链接:点击查看 题目大意:给出两个多项式 F( x ) 和 G( x ) 的系数,求其卷积后的系数 题目分析:存一个FFT的模板,原理学不明白,数论和dp都扔给队友了,当个快乐的fw 代码: // ...

  8. P4239 任意模数多项式乘法逆(多项式/ MTT)

    P4239 任意模数多项式乘法逆 这个题目简直就是毒瘤,不过还好我们可以使用vector封装要不然真的没法看,现在我们就会用vector封装MTT了,然后有一个代码细节就是这里的求逆还是在模意义下的, ...

  9. P4245 【模板】任意模数多项式乘法

    P4245 [模板]任意模数多项式乘法 https://www.luogu.com.cn/blog/AzusaCat/solution-p4245 首先这类问题指的是对于一个非NTT模数,我们如何计算 ...

最新文章

  1. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP
  2. 研发项目进度管理软件正式上线
  3. 掌握技术思想比解决问题本身更重要
  4. 【MyBatis使用】 mapper文件未编译 + statementType使用 + 返回结果字段顺序不一致 + 获取自增ID + 一个update标签批量更新记录
  5. openstack 云_探索OpenStack云案例研究
  6. 苹果6系统怎么更新不了_苹果App Store登录不了怎么办_登录不了App Store的解决办法?...
  7. Thymeleaf的入门(一)
  8. Chromium 内核新款 Edge 浏览器对比评测,微软找回面子全靠它了
  9. 向Array中添加二分插入排序
  10. Unix网络编程---第三次作业
  11. subsring 截取
  12. 对比几个空地址“订阅”的结果
  13. 荣耀6 android 7.0,依旧荣耀--荣耀6 升级到 荣耀7 智能手机
  14. 微博开放平台注册应用
  15. Timer和counter
  16. unity实用技能,控制renderQueue解决NGUI与Unity3D物体渲染顺序问题
  17. python抓取微博评论破亿_《战狼Ⅱ》破50亿 Python爬虫抓取获取12万条影评分析看它在说...
  18. 明知故犯还是执迷不悟?
  19. 2.0显示为整数 java_关于java:我知道为什么我需要在这里将整数文字转换为(int)?...
  20. javascript判断常用浏览器版本和类型兼容处理

热门文章

  1. CAS总结之Ticket篇
  2. 令人郁闷的DateTime.ToString()方法
  3. 【零基础学Java】—继承的概述(十九)
  4. HTML的基本知识(四)——文本格式化标签
  5. 医保要交多少年可以享受终身?医保断交2年有什么影响?
  6. Panorama是什么意思
  7. 干什么事都要先定位,再聚焦
  8. 赚钱只要找到方法,就如吸空气
  9. 电视如果使用独立显卡会怎么样?
  10. 寻找点赞所需的URL