模板题,直接套FFT。
ACcode:
#include<cstdio>
#include<cstring>
#include<complex>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<iostream>
using namespace std;
int ans[NS];
char s1[NS],s2[NS];
const int NS=1<<18;
const double pi=acos(-1.0);
struct Complex{
double x,y;
Complex() {}
Complex(double xa,double xb):x(xa),y(xb) {}
Complex operator + (const Complex mul)const{
return Complex(x+mul.x,y+mul.y);
}
Complex operator - (const Complex mul)const{
return Complex(x-mul.x,y-mul.y);
}
Complex operator * (const Complex mul)const{
return Complex(x*mul.x-y*mul.y,x*mul.y+y*mul.x);
}
double real(){ return x; }
}A[NS],B[NS],P[NS];
void build(Complex _P[],Complex P[],int n,int m,int pos,int &cnt)
{
if (m==n) {
_P[cnt++]=P[pos];
} else {
build(_P,P,n,m<<1,pos,cnt);
build(_P,P,n,m<<1,pos+m,cnt);
}
}
inline int binary(int x)
{
for (int i=1;;i<<=1)
if (i>=x) return i<<1;
}
void FFT(Complex P[],int &n,double oper)
{
int cnt=0;
static Complex _P[NS];
build(_P,P,n,1,0,cnt);
copy(_P,_P+n,P);
for (int d=1;d<n;d<<=1)
{
int D=d<<1;
double u=pi/d*oper;
Complex w,w0=Complex(cos(u),sin(u));
for (int i=0;i<n;i+=D)
{
w=Complex(1,0);
for (int j=0;j<d;j++)
{
Complex &P1=P[i+j+d];
Complex &P2=P[i+j];
Complex tmp=w*P1;
P1=P2-tmp;
P2=P2+tmp;
w=w*w0;
}
}
}
}
void AmulB() //Çó½â×Ö·û´®A=s1*s2
{
int len1=strlen(s1);
int len2=strlen(s2);
int n=binary(max(len1,len2));
for (int i=len1-1;i>=0;i--)
A[len1-i-1]=Complex(s1[i]-'0',0);
for (int i=len2-1;i>=0;i--)
B[len2-i-1]=Complex(s2[i]-'0',0);
for (int i=len1;i<n;i++) A[i]=Complex(0.0,0.0);
for (int i=len2;i<n;i++) B[i]=Complex(0.0,0.0);
FFT(A,n,1.0),FFT(B,n,1.0);
for (int i=0;i<n;i++) A[i]=A[i]*B[i];
FFT(A,n,-1.0);
}
int main()
{
while (~scanf("%s%s",s1,s2))
{
AmulB();
int i,tmp=0,n=binary(max(strlen(s1),strlen(s2)));
for(i=0;i<n;i++)
{
tmp+=(int)((A[i].real())/n+0.5);
ans[i]=int(tmp%10),tmp/=10;
}
for( i=n-1 ; !ans[i] && i>0 ; i--);
for(;i>=0;i--) printf("%d",ans[i]);
puts("");
}
return 0;
}