题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1402
题意:给出两个非负整数,求他们的乘积。
思路:FFT。
struct node
{
double x,y;
node(double _x=0.0,double _y=0.0)
{
x=_x;
y=_y;
}
node operator+(node a)
{
return node(x+a.x,y+a.y);
}
node operator-(node a)
{
return node(x-a.x,y-a.y);
}
node operator*(node a)
{
return node(x*a.x-y*a.y,x*a.y+y*a.x);
}
};
node A[N];
int L;
int reverse(int x)
{
int ans=0,i;
FOR0(i,L) if(x&(1<<i)) ans|=1<<(L-1-i);
return ans;
}
void bitReverseCopy(node a[],int n)
{
int i;
FOR0(i,n) A[i]=a[i];
FOR0(i,n)
{
a[reverse(i)]=A[i];
}
}
void fft(node a[],int n,int on)
{
bitReverseCopy(a,n);
int len,i,j,k;
node x,y,u,t;
for(len=2;len<=n;len<<=1)
{
x=node(cos(-on*2*PI/len),sin(-on*2*PI/len));
for(j=0;j<n;j+=len)
{
y=node(1,0);
for(k=j;k<j+len/2;k++)
{
u=a[k];
t=y*a[k+len/2];
a[k]=u+t;
a[k+len/2]=u-t;
y=y*x;
}
}
}
if(on==-1)
{
FOR0(i,n) a[i].x/=n;
}
}
node a[N],b[N];
char s1[N],s2[N];
int n,ans[N];
int main()
{
while(scanf("%s%s",s1,s2)!=-1)
{
int len1=strlen(s1);
int len2=strlen(s2);
n=1; L=0;
while(n<len1+len2) n<<=1,L++;
int i;
FOR0(i,len1) a[i]=node(s1[len1-1-i]-'0',0);
FOR0(i,len2) b[i]=node(s2[len2-1-i]-'0',0);
for(i=len1;i<n;i++) a[i]=node(0,0);
for(i=len2;i<n;i++) b[i]=node(0,0);
fft(a,n,1);
fft(b,n,1);
FOR0(i,n) a[i]=a[i]*b[i];
fft(a,n,-1);
clr(ans,0);
FOR0(i,n) ans[i]=(int)(a[i].x+0.5);
FOR0(i,n) ans[i+1]+=ans[i]/10,ans[i]%=10;
for(i=n-1;i>0&&!ans[i];i--);
while(i>=0) printf("%d",ans[i--]);
puts("");
}
}