A3.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const double PI(acos(-1.0));
  4. typedef complex<double> C;
  5. const int N = (1 << 17);
  6. int ans[N];
  7. C a[N], b[N];
  8. char s[N], t[N];
  9. void bit_reverse_swap(C *a, int n) {
  10. for (int i = 1, j = n >> 1, k; i < n - 1; ++i) {
  11. if (i < j) swap(a[i], a[j]);
  12. for (k = n >> 1; j >= k; j -= k, k >>= 1) // inspect the highest "1"
  13. ;
  14. j += k;
  15. }
  16. }
  17. void FFT(C *a, int n, int t) {
  18. bit_reverse_swap(a, n);
  19. for (int i = 2; i <= n; i <<= 1) {
  20. C wi(cos(2.0 * t * PI / i), sin(2.0 * t * PI / i));
  21. for (int j = 0; j < n; j += i) {
  22. C w(1);
  23. for (int k = j, h = i >> 1; k < j + h; ++k) {
  24. C t = w * a[k + h], u = a[k];
  25. a[k] = u + t;
  26. a[k + h] = u - t;
  27. w *= wi;
  28. }
  29. }
  30. }
  31. if (t == -1) {
  32. for (int i = 0; i < n; ++i) {
  33. a[i] /= n;
  34. }
  35. }
  36. }
  37. int trans(int x) {
  38. return 1 << int(ceil(log(x) / log(2) - 1e-9)); // math.h/log() 以e为底
  39. }
  40. int main() {
  41. int n, m, l;
  42. for (; ~scanf("%s%s", s, t);) {
  43. n = strlen(s);
  44. m = strlen(t);
  45. l = trans(n + m - 1); // n次*m次不超过n+m-1次
  46. for (int i = 0; i < n; ++i) a[i] = C(s[n - 1 - i] - '0');
  47. for (int i = n; i < l; ++i) a[i] = C(0);
  48. for (int i = 0; i < m; ++i) b[i] = C(t[m - 1 - i] - '0');
  49. for (int i = m; i < l; ++i) b[i] = C(0);
  50. FFT(a, l, 1); //把A和B换成点值表达
  51. FFT(b, l, 1);
  52. for (int i = 0; i < l; ++i) //点值做乘法
  53. a[i] *= b[i];
  54. FFT(a, l, -1); //逆DFT
  55. for (int i = 0; i < l; ++i) ans[i] = (int) (a[i].real() + 0.5);
  56. ans[l] = 0; // error-prone :'l' -> '1'
  57. for (int i = 0; i < l; ++i) {
  58. ans[i + 1] += ans[i] / 10;
  59. ans[i] %= 10;
  60. }
  61. int p = l;
  62. for (; p && !ans[p]; --p);
  63. for (; ~p; putchar(ans[p--] + '0'));
  64. puts("");
  65. }
  66. return 0;
  67. }