------------------题目链接---------------------

题目没啥说的,两个数相乘,fft,一发模板就AC,kuangbin模板大法好,不懂原理的小白也能体验AC。

个人学的比较菜,不懂原理,把学习资料整合一下。存一下模板。


大佬的讲解 另一个讲解

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cctype>
  4. #include <cmath>
  5. #include <set>
  6. #include <map>
  7. #include <list>
  8. #include <queue>
  9. #include <deque>
  10. #include <stack>
  11. #include <string>
  12. #include <vector>
  13. #include <iostream>
  14. #include <algorithm>
  15. #include <stdlib.h>
  16. #include <time.h>
  17. #include <complex>
  18. using namespace std;
  19. typedef long long LL;
  20. const int INF=2e9+1e8;
  21. const int MOD=1e9+7;
  22. const double eps=0.0000000001;
  23. void fre()
  24. {
  25. freopen("test.in","r",stdin);
  26. freopen("test.out","w",stdout);
  27. }
  28. #define MSET(a,b) memset(a,b,sizeof(a))
  29. const double PI=acos(-1.0);
  30. typedef complex<double> Complex;
  31. void change(Complex y[],int len)
  32. {
  33. int i,j,k;
  34. for(i=1,j=len/2; i<len-1; i++)
  35. {
  36. if(i<j)
  37. swap(y[i],y[j]);
  38. k=len/2;
  39. while(j>=k)
  40. {
  41. j-=k;
  42. k/=2;
  43. }
  44. if(j<k) j+=k;
  45. }
  46. }
  47. void fft(Complex y[],int len,int on)
  48. {
  49. change(y,len);
  50. for(int h=2; h<=len; h<<=1)
  51. {
  52. Complex wn(cos(-on * 2 * PI / h), sin(-on * 2 * PI / h));
  53. for(int j=0; j<len; j+=h)
  54. {
  55. Complex w(1,0);
  56. for(int k=j; k<j+h/2; k++)
  57. {
  58. Complex u=y[k];
  59. Complex t=w*y[k+h/2];
  60. y[k]=u+t;
  61. y[k+h/2]=u-t;
  62. w=w*wn;
  63. }
  64. }
  65. }
  66. if(on==-1)
  67. {
  68. for(int i=0; i<len; i++)
  69. y[i].real(y[i].real()/len);
  70. }
  71. }
  72. /******************************************************/
  73. const int MAXN = 200010;
  74. Complex x1[MAXN], x2[MAXN];
  75. char str1[MAXN / 2], str2[MAXN / 2];
  76. int sum[MAXN];
  77. int main()
  78. {
  79. while (scanf("%s%s", str1, str2) == 2)
  80. {
  81. int len1 = strlen(str1);
  82. int len2 = strlen(str2);
  83. int len = 1;
  84. while (len < len1 * 2 || len < len2 * 2) //2^n<
  85. len <<= 1;
  86. for (int i = 0; i < len1; i++)
  87. x1[i] = Complex(str1[len1 - 1 - i] - '0', 0);
  88. for (int i = len1; i < len; i++)
  89. x1[i] = Complex(0, 0);
  90. for (int i = 0; i < len2; i++)
  91. x2[i] = Complex(str2[len2 - 1 - i] - '0', 0);
  92. for (int i = len2; i < len; i++)
  93. x2[i] = Complex(0, 0);
  94. //求DFT
  95. fft(x1, len, 1);
  96. fft(x2, len, 1);
  97. for (int i = 0; i < len; i++)
  98. x1[i] = x1[i] * x2[i];
  99. fft(x1, len, -1);
  100. for (int i = 0; i < len; i++)
  101. sum[i] = (int)(x1[i].real() + 0.5);
  102. for (int i = 0; i < len; i++)
  103. {
  104. sum[i + 1] += sum[i] / 10;
  105. sum[i] %= 10;
  106. }
  107. len = len1 + len2 - 1;
  108. while (sum[len] <= 0 && len > 0)
  109. len--;
  110. for (int i = len; i >= 0; i--)
  111. printf("%c", sum[i] + '0');
  112. printf("\n");
  113. }
  114. return 0;
  115. }

大数相乘(hdu 1402)的更多相关文章

  1. HDU 1402 FFT 大数乘法

    $A * B$ FFT模板题,找到了一个看起来很清爽的模板 /** @Date : 2017-09-19 22:12:08 * @FileName: HDU 1402 FFT 大整数乘法.cpp * ...

  2. 两个大数相乘 - 高精度FFT

    HDU 1402 A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  3. POJ 2389 Bull Math(水~Java -大数相乘)

    题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: import java.ma ...

  4. 大数相乘算法C++版

    #include <iostream> #include <cstring> using namespace std; #define null 0 #define MAXN ...

  5. java版大数相乘

    在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 http://blog.csdn.net/jianzhibeihang/article/details/4948267 用j ...

  6. Linux C/C++ 编程练手 --- 大数相加和大数相乘

    最近写了一个大数相乘和相加的程序,结果看起来是对的.不过期间的效率可能不是最好的,有些地方也是临时为了解决问题而直接写出来的. 可以大概说一下相乘和相加的解决思路(当然,大数操作基本就是两个字符串的操 ...

  7. hdu 1402 A * B Problem Plus FFT

    /* hdu 1402 A * B Problem Plus FFT 这是我的第二道FFT的题 第一题是完全照着别人的代码敲出来的,也不明白是什么意思 这个代码是在前一题的基础上改的 做完这个题,我才 ...

  8. Karatsuba乘法--实现大数相乘

    Karatsuba乘法 Karatsuba乘法是一种快速乘法.此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表.此算法主要用于两个大数相乘 ...

  9. leetcode 43 Multiply Strings 大数相乘

    感觉是大数相乘算法里面最能够描述.模拟演算过程的思路 class Solution { public String multiply(String num1, String num2) { if(nu ...

随机推荐

  1. spring事务详细理解

    数据并发的问题 一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库.数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致各种并发问题,破坏数据的完整性.这些 ...

  2. python--文本处理1

    1.字符和字符值之间的转换 内建函数:ord(),chr() >>> print ord("a") 97 >>> print chr(97) a ...

  3. Unity -- 入门教程三

    进入这个页面,按编译器版本进行下载,我用的是2010,所以要下载这个. 安装就不用我教了,下面开始看我是如何导入Unity VS的. 点击Import之后我们会发现并没有发生什么,但是接下来我们按一下 ...

  4. python读取txt、csv和excel文件

    一.python读取txt文件:(思路:先打开文件,读取文件,最后用for循环输出内容) fp = open('test.txt','r') lines = fp.readlines() fp.clo ...

  5. Odoo10尝鲜:MRP 10 新概念

    OEE [ overall equipment Effectiveness 整体设备效率 ] 整體設備效率是整合稼働率 (Availability).產能效率 (Performance).良率 (Qu ...

  6. Populating Next Right Pointers in Each Node I, II——生成next树

    1. Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode * ...

  7. js随机数 从头开始系列

    js要常常写啊要不然就要从0开始 1 var num = Math.random(); //创建一个0-1随机数字 num*=10 //变为0-10随机数字 //有好几种取整方式 var i = Ma ...

  8. vs附加到多个进程调试

    我们用vs调试,通常附加到一个进程进行调试,有时候需要同时附加到多个进程. 例如:同时调试客户端与服务端,我们需要同时附加到客户端与服务端进程. 按F5(执行)键调试,程序只要遇到断点就中断. 按F1 ...

  9. adb命令具体解释(二)——手机缺失sqlite3时操作数据库的多种解决方式

    在android应用开发无处不在SQLite数据库的身影.那么在开发中怎么使用adb命令操作数据库的功能呢? 以下我们将完整的介绍与数据库操作相关的命令集及当手机缺少sqlite3的时候的多种解决方式 ...

  10. 计算机的一些经典书籍CS经典书单

    c++: <c++程序设计> <c++primer> <effective c++> <more effective c++> <深入探索c++对 ...