#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ld double
ld pi=acos(-1.0); //注意π的精度
const int N=50000+100;
struct Complex{
ld r;
ld i;
Complex(){};
Complex(ld a,ld b){
r=a;i=b;
}
Complex operator +(const Complex &t)const{
return Complex(r+t.r,i+t.i);
}
Complex operator -(const Complex &t)const{
return Complex(r-t.r,i-t.i);
}
Complex operator *(const Complex &t)const{
return Complex(r*t.r-i*t.i,r*t.i+i*t.r);
}
}a1[500010],a2[500010];
void fft(Complex y[],int n,int rev){
for(int i=1,j,k,t;i<n;i++){
for(j=0,k=n>>1,t=i;k;k>>=1,t>>=1) j=j<<1|t&1;
if(i<j) swap(y[i],y[j]);
}
for(int s=2,ds=1;s<=n;ds=s,s<<=1){
Complex wn=Complex(cos(rev*2*pi/s),sin(rev*2*pi/s)),w=Complex(1,0),t;
for(int k=0;k<ds;k++,w=w*wn){
for(int i=k;i<n;i+=s){
t=w*y[i+ds];
y[i+ds]=y[i]-t;
y[i]=y[i]+t;
}
}
}
if(rev==-1) for(int i=0;i<n;i++) y[i].r/=n;
}
char ss[N],tt[N];
int ans[N*2];
int main()
{
while(scanf("%s%s",ss,tt)!=EOF)
{
int ls=strlen(ss);
int lt=strlen(tt);
int len=1;
while(len<=max(ls,lt))len<<=1;
//printf("%d\n",len);
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
for(int i=0;i<ls;i++)
{
a1[i].r=ss[ls-1-i]-'0';
}
for(int i=0;i<lt;i++)
{
a2[i].r=tt[lt-1-i]-'0';
}
fft(a1,len,1);
fft(a2,len,1);
for(int i=0;i<=len;i++)a1[i]=a1[i]*a2[i];
fft(a1,len,-1);
for(int i=0;i<=len;i++)ans[i]=(int)(a1[i].r+0.5);
for(int i=0;i<=len;i++)
{
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
for(int i=len;i>=0;i--)
{
if(ans[i]||i==0)
{
for(int j=i;j>=0;j--)
{
printf("%d",ans[j]);
}printf("\n");
break;
}
}
}
return 0;
}
fft
最新推荐文章于 2017-08-19 09:52:00 发布