rt,时间复杂度肯定是对的,FFT 在本地跑第一个测试点用了 5.64s,话说是那里常数太大了?或者说这道题只放 NTT 过了?
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 10;
#define F(i,a,b) for(int i = a; i < b; i++)
typedef long double ld;
struct cp {
ld x, y;
cp() { x = 0.0L, y = 0.0L; };
cp(ld xx, ld yy) { x = xx, y = yy; }
cp operator+(cp b) { return cp(x + b.x, y + b.y); }
cp operator-(cp b) { return cp(x - b.x, y - b.y); }
cp operator*(cp b) { return cp(x * b.x - y * b.y, x * b.y + y * b.x); }
};
const ld pi = 3.1415926535897932L; cp u, t;
int ans[N], bit = 0, rev[N];
void FFT(cp* a, int n, int f) {
if (n == 1)return;
for (int i = 0; i < n; i++)if (i < rev[i]) swap(a[i], a[rev[i]]);
for (int mid = 1; mid < n; mid <<= 1) {
cp wn(cos(pi / (ld)mid), (ld)f * sin(pi / (ld)mid));
for (int i = 0; i < n; i += (mid << 1)) {
cp w(1.0L, 0.0L);
for (int j = 0; j < mid; j++) {
u = a[i + j], t = w * a[i + j + mid];
a[i + j] = u + t, a[i + j + mid] = u - t;
w = w * wn;
}
}
}
}
cp a[N], c[N]; int n;
void work() {
FFT(a, n, 1), FFT(c, n, 1);
F(i, 0, n)a[i] = a[i] * c[i];
FFT(a, n, -1);
F(i, 0, n)ans[i] = int(a[i].x / (ld)n + 0.1L);
F(i, 0, n)ans[i + 1] += ans[i] / 10, ans[i] = ans[i] % 10;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(); cout.tie();
string s1, s2;
cin >> s1 >> s2;
F(i, 0, s1.size())a[i].x = ld(s1[s1.size() - i - 1] - '0');
F(i, 0, s2.size())c[i].x = ld(s2[s2.size() - i - 1] - '0');
n = 1; int len = s1.size() + s2.size() - 1;
while (n <= len)n <<= 1, ++bit;
F(i, 0, n)rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1)); work();
len = s1.size() + s2.size() - 1;
while (ans[len] == 0 && len)--len;
for (int i = len; i >= 0; i--)cout << ans[i];
return 0;
}