很裸的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;
}