hdu1402 A * B Problem Plus
阿新 • • 發佈:2019-02-20
很裸的FFT。
原理到處都有(看演算法導論就可以學懂了)。
#include<bits/stdc++.h> using namespace std; typedef complex<double> cpx; const int MAXN = 50000 * 3; const double PI = 3.1415926535897932384626433832795; void FFT(vector<cpx> &A, bool inv) { int n = A.size(); for(int i = 0, j = 0; i < n; i++) { if(j > i) swap(A[j], A[i]); int t = n; while(j & (t >>= 1)) j ^= t; j |= t; } double pi = inv ? -PI : PI; for(int step = 1; step < n; step <<= 1) { double alpha = pi / step; for(int k = 0; k < step; k++) { cpx wk = exp(cpx(0, alpha * k)); for(int Ek = k; Ek < n; Ek += step << 1) { int Ok = Ek + step; cpx t = wk * A[Ok]; A[Ok] = A[Ek] - t; A[Ek] = A[Ek] + t; } } } if(inv) for(int i = 0; i < n; i++) A[i] /= n; } void Multi(vector<int> &a, vector<int> &b, vector<int> &c) { int len = 1, M = max(a.size(), b.size()) * 2; while(len < M) len <<= 1; vector<cpx> A(len, 0), B(len, 0); for(int i = 0; i < a.size(); i++) A[i].real(a[i]); for(int i = 0; i < b.size(); i++) B[i].real(b[i]); FFT(A, 0), FFT(B, 0); for(int i = 0; i < len; i++) A[i] *= B[i]; FFT(A, 1); c.resize(len); long long over = 0; for(int i = 0; i < len; i++) { over += A[i].real() + 0.5; c[i] = over % 10; over /= 10; } while(!c[len - 1] && len > 1) len--; c.resize(len); } vector<int> a, b, c; string s; int main() { while(cin >> s) { a.clear(), b.clear(); for(int i = 1; i <= s.size(); i++) a.push_back(s[s.size() - i] - '0'); cin >> s; for(int i = 1; i <= s.size(); i++) b.push_back(s[s.size() - i] - '0'); Multi(a, b, c); for(int i = c.size() - 1; i >= 0; i--) printf("%d", c[i]); puts(""); } return 0; }