蒟蒻第一次写FFT,调炸了
#include<bits/stdc++.h>
using namespace std;
double pie=acos(-1);
typedef complex<double> cp;
char s1[3000001],s2[3000001];
cp a[3000001],b[3000001];
int n,ans[3000001],rev[3000001];
void init(int k){
int len=1<<k;
for(int i=0;i<len;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
}
void FFT(cp *a,int n,int f){
for (int i=0;i<n;i++) {
if (i<rev[i]) swap(a[i],a[rev[i]]);
}
for (int h=1;h<n;h<<=1) {
cp wn=exp(cp(0,f*pie/h));
for (int j=0;j<n;j+=(h*2)) {
cp w(1,0);
for (int k=j;k<j+h;k++) {
cp x=a[k];
cp y=w*a[k+h];
a[k]=x+y;
a[k+h]=x-y;
w*=wn;
}
}
}
if(f==-1) for(int i=0;i<n;i++) a[i]/=n;
}
int main(){
scanf("%s %s",s1,s2);
n=max(strlen(s1),strlen(s2));
for (int i=0;i<n;i++) {
a[i]=double(s1[n-i-1]-'0');
b[i]=double(s2[n-i-1]-'0');
}
int k=1,s=2;
while ((1<<k)<(n*2-1)) k++,s=s<<1;
init(k);
FFT(a,s,1);
FFT(b,s,1);
for (int i=0;i<s;i++) {
a[i]=a[i]*b[i];
}
FFT(a,s,-1);
for (int i=0;i<s;i++) {
ans[i]+=(int)(a[i].real()+0.5);
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
while (ans[s]==0&&s>-1) s--;
if (s==-1) {
printf("0");
return 0;
}
for (int i=s;i>=0;i--) printf("%d ",ans[i]);
}
大佬帮忙谢谢