1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
#define rep(i,x,y) for(register int i=x;i<=y;++i) #define repd(i,x,y) for(register int i=x;i>=y;--i) #define PI acos(-1) using namespace std; const int N=1e6+7; struct { double x,y; cpx(){}; cpx(double a,double b){x=a;y=b;} inline cpx operator * (cpx b){return cpx(x*b.x-y*b.y,b.x*y+b.y*x);} inline cpx operator *= (cpx b){*this=*this*b;} inline cpx operator + (cpx b){return cpx(x+b.x,y+b.y);} inline cpx operator - (cpx b){return cpx(x-b.x,y-b.y);} }A[N],B[N]; char str[N]; int n,m,R[N],L,ans[N]; void fft(cpx *a,int f){ rep(i,0,n)if(i<R[i])swap(a[i],a[R[i]]); for(register int i=1;i<n;i<<=1){ cpx nw=cpx(cos(PI/i),f*sin(PI/i)); for(register int j=0;j<n;j+=(i<<1)){ cpx w=cpx(1,0); for(register int k=0;k<i;k++,w*=nw){ cpx x=a[j+k],y=w*a[i+j+k]; a[j+k]=x+y;a[i+j+k]=x-y; } } } if(f==-1)rep(i,0,n-1)a[i].x/=n; } int main(){ scanf("%d",&n); scanf("%s",str); repd(i,n-1,0)A[n-1-i].x=str[i]-'0'; scanf("%s",str); repd(i,n-1,0)B[n-1-i].x=str[i]-'0'; m=n<<1; for(n=1;n<=m;n<<=1,++L); rep(i,0,n-1)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1)); fft(A,1);fft(B,1); rep(i,0,n-1)A[i]*=B[i]; fft(A,-1); rep(i,0,n-1){ ans[i]+=(int)(A[i].x+0.5); if(ans[i]>=10){ ans[i+1]+=ans[i]/10; ans[i]%=10; n+=(i==n); } } while(!ans[n]&&n>=1)n--; m++; repd(i,n,0)printf("%d",ans[i]); return 0; }
|
近期评论