这道题是快速傅里叶变换的最模板的题了,存个板子
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const double pi = acos(-1.0);
const int N = 200005;
struct Complex{
double r,i;
Complex(double r = 0,double i = 0):r(r),i(i){}
Complex operator + (const Complex &a)const{
return Complex(r + a.r,i + a.i);
}
Complex operator - (const Complex &a)const{
return Complex(r - a.r,i - a.i);
}
Complex operator * (const Complex &a)const{
return Complex(r * a.r - i * a.i,r * a.i + i * a.r);
}
Complex operator / (const double &a)const{
return Complex(r / a,i / a);
}
};
char s[N];
Complex x1[N],x2[N],x3[N];
Complex tmp[N];
int res[N],tn;
int rev(int x){
int res = 0;
for(int i = 0 ; i < tn ; i ++){
if(x & 1) res += 1 << tn - i - 1;
x >>= 1;
}
return res;
}
//op == 1 DFT,op == -1 IDFT
void fft(Complex a[],int n,int op){
for(int i = 0 ; i < n ; i ++) tmp[ rev(i) ] = a[i];
for(int i = 0 ; i < n ; i ++) a[i] = tmp[i];
for(int i = 1 ; (1 << i) <= n ; i ++){
int m = 1 << i;
Complex wn(cos(op * 2 * pi / m),sin(op * 2 * pi / m));
for(int k = 0 ; k < n ; k += m){
Complex w(1,0),u,t;
for(int j = 0 ; j < m / 2 ; j ++){
u = a[k + j];
t = w * a[k + j + m / 2];
a[k + j] = u + t;
a[k + j + m / 2] = u - t;
w = w * wn;
}
}
}
if(op == -1) for(int i = 0 ; i < n ; i ++) a[i] = a[i] / n;
}
int main()
{
int len1,len2,len;
while(~scanf("%s",s)){
len1 = strlen(s);
for(int i = 0 ; i < len1 ; i ++)
x1[len1 - 1 - i] = Complex(s[i] - '0',0);
scanf("%s",s);
len2 = strlen(s);
for(int i = 0 ; i < len2 ; i ++)
x2[len2 - 1 - i] = Complex(s[i] - '0',0);
tn = ceil(log(len1 + len2 + 0.0) / log(2.0));
len = 1 << tn;
for(int i = len1 ; i < len ; i ++) x1[i] = Complex(0,0);
for(int i = len2 ; i < len ; i ++) x2[i] = Complex(0,0);
fft(x1,len,1);
fft(x2,len,1);
for(int i = 0 ; i < len ; i ++) x1[i] = x1[i] * x2[i];
fft(x1,len,-1);
for(int i = 0 ; i < len ; i ++) res[i] = int(x1[i].r + 0.5);
for(int i = 0 ; i < len ; i ++){
res[i + 1] += res[i] / 10;
res[i] %= 10;
}
int tail = len - 1;
while(tail && res[tail] == 0) tail --;
while(tail >= 0) printf("%d",res[tail --]);
printf("\n");
}
return 0;
}