#include <bits/stdc++.h> using namespace std; typedef complex<double> CPX; const int maxn = 2E5 + 10; const double PI = acos(-1); char s1[maxn], s2[maxn]; int ans[maxn]; void FFT(vector<CPX>&A, int op) { int n = A.size(); for (int i = 0, j = 0, k; i < n; i++) { if (j > i) swap(A[i], A[j]); for (k = n; j & (k >>= 1); j &= (~k)); j |= k; } double pi = PI * op; for (int m = 1; m < n; m <<= 1) for (int i = 0; i < m; i++) { CPX tmp = exp(CPX(0, pi / m * i)); for (int j = i; j < n; j += (m << 1)) { CPX t = tmp * A[j + m]; A[j + m] = A[j] - t, A[j] = A[j] + t; } } if (op == -1) for (int i = 0; i < n; i++) A[i] /= n; } void INT_CPX(char *s, vector<CPX> &o) { int len = strlen(s); for (int i = 0; s[i]; i++) o[len - i - 1].real(s[i] - 48); } void CPX_INT(vector<CPX> O, int *n) { for (int i = 0; i < O.size(); i++) n[i] = O[i].real() + 0.5; for (int i = 0; i < O.size(); i++) n[i + 1] += n[i] / 10, n[i] %= 10; } bool readin() { if (scanf("%s", s1) == EOF) return 0; else return scanf("%s", s2), 1; } void writeout(int *n, int len) { for (len--; ans[len] == 0 && len; len--); for (; len >= 0; len--) printf("%d", n[len]); printf("\n"); } void MULT(char *a, char *b) { int len1 = strlen(a) << 1, len2 = strlen(b) << 1, len = 1; while (len < max(len1, len2)) len <<= 1; vector<CPX> X(len, 0), Y(len, 0), Z(len, 0); INT_CPX(a, X), INT_CPX(b, Y); FFT(X, 1), FFT(Y, 1); for (int i = 0; i < len; i++) Z[i] = X[i] * Y[i]; FFT(Z, -1); memset(ans, 0, sizeof(ans)); CPX_INT(Z, ans); writeout(ans, len); } int main(int argc, char const *argv[]) { while (readin()) MULT(s1, s2); return 0; }
FFT的模板运用,A*B problem。