近日背完FFT板子之后自己敲了一遍
#include <bits/stdc++.h>
#define MAXN 3000100
using namespace std;
char s1[MAXN], s2[MAXN];
int n = 0, m = 0, ans[MAXN], a = 0, b = 0, lim = 1, l, r[MAXN];
const double pi = acos(-1.0), eps = 1e-6;
struct Complex {
double a, b;
inline Complex(double x = 0, double y = 0) : a(x), b(y) {}
} A[MAXN], B[MAXN];
inline Complex operator + (Complex x, Complex y) {
return Complex(x.a + y.a, x.b + y.b);
}
inline Complex operator - (Complex x, Complex y) {
return Complex(x.a - y.a, x.b - y.b);
}
inline Complex operator * (Complex x, Complex y) {
return Complex(x.a * y.a - x.b * y.b, x.a * y.b + x.b * y.a);
}
inline void FFT(Complex *c, double opt) {
for(int i = 0; i < lim; i++)
if(i < r[i]) swap(c[i], c[r[i]]);
for(int j = 1; j < lim; j <<= 1) {
Complex T(cos(pi / j), opt * sin(pi / j));
for(int k = 0; k < lim; k += (j << 1)) {
Complex t(1, 0);
for(l = 0; l < j; l++, t = t * T) {
Complex newx = c[k + l], newy = t * c[k + j + l];
c[k + l] = newx + newy;
c[k + j + l] = newx - newy;
}
}
}
}
int main(void) {
gets(s1), gets(s2);
n = strlen(s1), m = strlen(s2);
for(int i = n - 1; i >= 0; i--) A[a++].a = s1[i] - 48;
for(int i = m - 1; i >= 0; i--) B[b++].a = s2[i] - 48;
while(lim < n + m) lim <<= 1, l++;
for(int i = 0; i <= lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
FFT(A, 1), FFT(B, 1);
for(int i = 0; i <= lim; i++) A[i] = A[i] * B[i];
FFT(A, -1);
for(int i = 0; i <= lim; i++) {
ans[i] += (int) (A[i].a / lim + eps);
if(ans[i] >= 10)
ans[i + 1] += ans[i] / 10, ans[i] %= 10, lim += (i == lim);
}
while(!ans[lim] && lim >= 1) lim--;
lim++;
while(--lim >= 0) printf("%d",ans[lim]);
return 0;
}
然后提交上去全WA 背的是第一篇题解
求大佬指教