2016-06-01  09:34:54

很久很久很久以前写的了。。。

今天又比较了一下效率,貌似手写复数要快很多。

贴一下模板:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cmath>
  7. #include<queue>
  8. #include<complex>
  9. #define ll long long
  10. #define N 500020
  11. using namespace std;
  12. int read(){
  13. int x=,f=;char ch=getchar();
  14. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  15. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  16. return x*f;
  17. }
  18. struct CD{
  19. double a,b;
  20. CD(double x=,double y=){a=x;b=y;}
  21. friend CD operator +(CD n1,CD n2){return CD(n1.a+n2.a,n1.b+n2.b);}
  22. friend CD operator -(CD n1,CD n2){return CD(n1.a-n2.a,n1.b-n2.b);}
  23. friend CD operator *(CD n1,CD n2){return CD(n1.a*n2.a-n1.b*n2.b,n1.a*n2.b+n1.b*n2.a);}
  24. };
  25. int n,m,bit=;
  26. const long double Pi=acos(-1.0);
  27.  
  28. void FFT(CD *a,int n,int type){
  29. for(int i=,j=;i<n;i++) {
  30. if(j>i)swap(a[i],a[j]);
  31. int k=n;
  32. while(j&(k >>= ))j&=~k;
  33. j|=k;
  34. }
  35. for(int i=;i<=bit;i++){
  36. CD w_n(cos(*type*Pi/(<<i)),sin(*type*Pi/(<<i)));
  37. for(int j=;j<(<<bit);j+=(<<i)){
  38. CD w(,);
  39. for(int k=j;k<j+(<<(i-));k++){
  40. CD tmp=a[k],tt=w*a[k+(<<(i-))];
  41. a[k]=a[k]+tt;
  42. a[k+(<<(i-))]=tmp-tt;
  43. w=w*w_n;
  44. }
  45. }
  46. }
  47. if(type<) for(int i=;i<(<<bit);i++) a[i].a=(a[i].a+0.5)/(<<bit);
  48. }
  49.  
  50. CD poly1[N],poly2[N];
  51. int c[N*];
  52.  
  53. char ch[N];
  54. int main (){
  55. n=read();
  56. scanf("%s",ch+);
  57. for(int i=;i<n;i++)poly1[i]=(double)(ch[n-i]-'');
  58. scanf("%s",ch+);
  59. for(int i=;i<n;i++)poly2[i]=(double)(ch[n-i]-'');
  60. bit=;
  61. while(<<bit<(n<<))bit++;
  62. n=<<bit;
  63. FFT(poly1,n,);FFT(poly2,n,);
  64. for(int i=;i<n;i++)poly1[i]=poly1[i]*poly2[i];
  65. FFT(poly1,n,-);
  66. int jin=,top=;
  67. for(int i=;i<n;i++){
  68. jin+=(int)(poly1[i].a+0.5);
  69. c[++top]=jin%;
  70. jin/=;
  71. }
  72. while(top&&c[top]==) top--;
  73. while(top)putchar(c[top--]+'');
  74. return ;
  75. }

2179: FFT快速傅立叶

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 2552  Solved: 1299
[Submit][Status][Discuss]

Description

给出两个n位10进制整数x和y,你需要计算x*y。

Input

第一行一个正整数n。 第二行描述一个位数为n的正整数x。 第三行描述一个位数为n的正整数y。

Output

输出一行,即x*y的结果。

Sample Input

1
3
4

Sample Output

12

数据范围:
n<=60000

【bzoj2179】FFT快速傅立叶 FFT模板的更多相关文章

  1. 【BZOJ 2179】 2179: FFT快速傅立叶 (FFT)

    2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3308  Solved: 1720 Description 给出两个n位 ...

  2. bzoj 2179: FFT快速傅立叶 -- FFT

    2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MB Description 给出两个n位10进制整数x和y,你需要计算x*y. Input ...

  3. BZOJ2179:FFT快速傅立叶(FFT)

    Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出 ...

  4. spoj VFMUL FFT快速傅立叶变换模板题

    题意:求两个数相乘. 第一次写非递归的fft,因为一个数组开小了调了两天TAT. #include<iostream> #include<cstring> #include&l ...

  5. 【bzoj2179】FFT快速傅立叶 FFT

    题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出 输出一行,即x*y的结果. 样例 ...

  6. BZOJ2179: FFT快速傅立叶 FFT实现高精度乘法

    Code: #include <cstdio> #include <algorithm> #include <cmath> #include <cstring ...

  7. BZOJ 2179 FFT快速傅立叶 ——FFT

    [题目分析] 快速傅里叶变换用于高精度乘法. 其实本质就是循环卷积的计算,也就是多项式的乘法. 两次蝴蝶变换. 二进制取反化递归为迭代. 单位根的巧妙取值,是的复杂度成为了nlogn 范德蒙矩阵计算逆 ...

  8. bzoj 2179 FFT快速傅立叶 —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2179 默写板子,注释的是忘记的地方. 代码如下: #include<iostream& ...

  9. [bzoj2179]FFT快速傅立叶_FFT

    FFT快速傅立叶 bzoj-2179 题目大意:给出两个n位10进制整数x和y,你需要计算x*y. 注释:$1\le n\le 6\times 10^4$. 想法: $FFT$入门题. $FFT$实现 ...

随机推荐

  1. 【JAVA多线程中使用的方法】

    一.sleep和wait的区别. 1.wait可以指定时间,也可以不指定. 而sleep必须制定. 2.在同步的时候,对于CPU的执行权和以及锁的处理不同. wait:释放执行权,释放锁. sleep ...

  2. sort函数用法

    原文链接:http://blog.csdn.net/csust_acm/article/details/7326418 sort函数的用法 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己 ...

  3. java中常用的工具类(三)

    继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类       ...

  4. HDU5489 Removed Interval(动态规划)

    一个长度为n的序列,删除任意长度为l的连续子序列后,求剩下的序列的最长公共子序列. 先求出以第i个元素为开始的LIS的长度,再一次循环,对所要求的结果更新 #include<iostream&g ...

  5. JavaScript - UnderScore

    UnderScore 第一步 call(this) (function() {}.call(this)); 一些简单的初始化操作 (function() { var root = this; var ...

  6. 配置ogg异构oracle-mysql(3)目的端配置

    目的端配置大致分为如下三个步骤:配置mgr,配置checkpoint table,配置应用进程 在目的端先创建一张表,记得带主键: mysql> create database hr;Query ...

  7. 时间编程,王明学learn

    时间编程 一.时间类型 Coordinated Universal Time(UTC):世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT) Calend ...

  8. UE对一个很长的字符按16位自动换行

    ① ②设定16个位 ③ ④结果

  9. C#分布式缓存Couchbase使用

    目前C#业界使用得最多的 Cache 系统主要是 Memcached和 Redis. 这两个 Cache 系统可以说是比较成熟的解决方案,也是很多系统当然的选择. 一.简介 目前C#业界使用得最多的 ...

  10. Android Fragment学习笔记(二)----Fragment界面添加和管理

    Fragment界面添加 了解过fragment的生命周期等简单知识,于是去看官方文档来了解更多相关内容,要添加fragment到我们的UI界面中,给出了两种常用的方法,第一个是在activity的布 ...