複習了一發FFT的模板 然後只想說 這TM到底都是在幹啥QAQ
好吧 以後要找機會重新學QAQ
存個模板在這裏
今天看那個數學也是醉了啊orzorz
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<complex>
#define SF scanf
#define PF printf
#define DPI (PI*2)
using namespace std;
typedef long long LL;
const double PI = acos(-1.0);
const int MAXN = 200000;
char A[MAXN+10], B[MAXN+10];
int ans[MAXN+10];
struct cpx {
double re, im;
cpx () {}
cpx(double a, double b) : re(a), im(b) {}
cpx operator + (const cpx &t) {
return cpx(re + t.re, im + t.im);
}
cpx operator - (const cpx &t) {
return cpx(re - t.re, im - t.im);
}
cpx operator * (const cpx &t) {
return cpx(re * t.re - im * t.im, im * t.re + re * t.im);
}
} xi[MAXN+10], xo[MAXN+10], yi[MAXN+10], yo[MAXN+10];
cpx EXP(double theta) {
return cpx(cos(theta), sin(theta));
}
void FFT(cpx *X, int n, int dir) {
for(int i = 0, j = 0; i < n; i++) {
if(j > i) swap(X[i], X[j]);
int k = n;
while(j & (k >>= 1)) j ^= k;
j |= k;
}
for(int step = 1; step < n; step <<= 1) {
double angle = dir * PI / step;
for(int k = 0; k < step; k++) {
cpx omegak = EXP(angle * k);
for(int Ek = k; Ek < n; Ek += step << 1) {
int KK = Ek + step;
cpx t = omegak * X[KK];
X[KK] = X[Ek] - t;
X[Ek] = X[Ek] + t;
}
}
}
}
void trans(cpx *xi, char *A, int len, int len1) {
for(int i = 0; i <= len; i++) {
if(i < (len1 >> 1)) {
xi[i].re = A[i] - '0';
xi[i].im = 0;
}
else xi[i].re = xi[i].im = 0;
}
}
int main() {
while(~SF("%s%s", A, B)) {
int len1 = strlen(A) << 1, len2 = strlen(B) << 1;
int len = 1, Maxl = max(len1, len2);
while(len < Maxl) len <<= 1;
trans(xi, A, len, len1);
trans(yi, B, len, len2);
FFT(xi, len, 1);
FFT(yi, len, 1);
for(int i = 0; i < len; i++) xi[i] = xi[i] * yi[i];
FFT(xi, len, -1);
for(int i = 0; i < len; i++) xi[i].re /= len;
int over = len = 0;
for(int i = ((len1 + len2) >> 1) - 2; i >= 0; i--) {
int t = xi[i].re + over + 0.5;
ans[len++] = t % 10;
over = t / 10;
}
while(over) ans[len++] = over % 10, over /= 10;
len--;
while(len >= 0 && !ans[len]) len--;
if(len < 0) len = 0;
for(int i = len; i >= 0; i--) PF("%d", ans[i]);
puts("");
}
}