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 57 58 59 60 61 62 63 64 65 66 67
| #include<bits/stdc++.h> #define N 140000 #define pi acos(-1) using namespace std; typedef complex<double> E; int n,m,L; char ch[N]; int R[N],c[N]; E a[N],b[N]; void fft(E *a,int f) { for(int i=0;i<n;i++) { if(i<R[i]) swap(a[i],a[R[i]]); } for(int i=1;i<n;i<<=1) { E wn(cos(pi/i),f*sin(pi/i)); for(int j=0;j<n;j+=(i<<1)) { E w(1,0); for(int k=0;k<i;k++,w*=wn) { E x=a[j+k],y=w*a[j+k+i]; a[j+k]=x+y; a[j+k+i]=x-y; } } } if(f==-1) for(int i=0;i<n;i++) a[i]/=n; } int main() { scanf("%d",&n); n--; scanf("%s",ch); for(int i=0;i<=n;i++) a[i]=ch[i]-'0'; scanf("%s",ch); for(int i=0;i<=n;i++) b[i]=ch[i]-'0'; m=2*n; for(n=1;n<=m;n<<=1) L++; for(int i=0;i<n;i++) { R[i]=(R[i>>1]>>1)|((i&1)<<(L-1)); } fft(a,1); fft(b,1); for(int i=0;i<=n;i++) { a[i]*=b[i]; } fft(a,-1); for(int i=0;i<=m;i++) { c[i]=(int)(a[i].real()+0.1); } for(int i=m;i>=1;i--) { if(c[i]>=10) { c[i-1]+=c[i]/10; c[i]%=10; } } for(int i=0;i<=m;i++) printf("%d",c[i]); return 0; }
|