[模板]快速傅里叶变换 FFT
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstring>
using namespace std;
#define reg register
inline int read() {
int res = 0;char ch = getchar();bool fu = 0;
while(!isdigit(ch)) fu |= (ch == '-'), ch = getchar();
while(isdigit(ch)) res = (res << 3) + (res << 1) + (ch ^ 48), ch = getchar();
return fu ? - res : res;
}
namespace BriMon
{
#define N 300005
const double Pi = 3.14159265358979323846264338327950;
int n, m, rev[N<<2];
struct cmplx {
double x, y;
cmplx() { }
cmplx(double aa, double bb) {x = aa, y = bb;}
friend cmplx operator + (cmplx a, cmplx b) { return cmplx(a.x + b.x, a.y + b.y); }
friend cmplx operator - (cmplx a, cmplx b) { return cmplx(a.x - b.x, a.y - b.y); }
friend cmplx operator * (cmplx a, cmplx b) { return cmplx(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);}
} b[N<<2], c[N<<2];
void fft(cmplx *f, int op)
{
for (int i = 0 ; i < n ; i ++) if (i < rev[i]) swap(f[i], f[rev[i]]);
for (int p = 2 ; p <= n ; p <<= 1)
{
int len = p >> 1;
cmplx tmp = cmplx(cos(Pi / len), op * sin(Pi / len));
for (int k = 0 ; k < n ; k += p)
{
cmplx w = cmplx(1, 0);
for (reg int l = k ; l < k + len ; l ++)
{
cmplx __tmp = w * f[l + len];
f[l + len] = f[l] - __tmp;
f[l] = f[l] + __tmp;
w = w * tmp;
}
}
}
}
char s1[N], s2[N];
int ans[N<<1];
int L;
int main()
{
scanf("%s", s1);
scanf("%s", s2);
int l1 = strlen(s1), l2 = strlen(s2);
if (l1 < l2) swap(l1, l2), swap(s1, s2);
n = max(l1, l2);
for (int i = 0 ; i < n ; i ++) b[i].x = s1[n - i - 1] - '0';
for (int i = 0 ; i < l2 ; i ++) c[i].x = s2[l2 - i - 1] - '0';
m = n << 1;
for (n = 1 ; n <= m ; n <<= 1) ++L;
for (int i = 0 ; i < n ; i ++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (L - 1));
fft(b, 1), fft(c, 1);
for (int i = 0 ; i < n ; i ++) b[i] = b[i] * c[i];
fft(b, -1);
for (int i = 0 ; i <= m ; i ++) ans[i] = (int) (b[i].x / n + 0.1);
for (int i = 0 ; i <= m ; i ++)
if (ans[i] >= 10) {
ans[i + 1] += ans[i] / 10, ans[i] %= 10;
if (i == m) ++m;
}
while(m) if(ans[m]) break; else m--;
for (int i = m ; i >= 0 ; i --) printf("%d", ans[i]);
return 0;
}
}
int zZh = BriMon :: main();
int main() {return 0;}

浙公网安备 33010602011771号