[hdu1402]A*B Problem Plus
可以这很傅立叶。

1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <string> 7 #include <vector> 8 #include <cmath> 9 #include <complex> 10 using namespace std; 11 12 const int N=60000; 13 const double PI=acos(-1); 14 15 typedef complex<double> c; 16 17 int rev(int id, int len) 18 { 19 int ret = 0; 20 for(int i = 0; (1 << i) < len; i++) 21 { 22 ret <<= 1; 23 if(id & (1 << i)) ret |= 1; 24 } 25 return ret; 26 } 27 28 c F[150000]; 29 void fft(c *a,int n,int f){ 30 for(int i=0;i<n;i++)F[rev(i,n)]=a[i]; 31 for(int i=1;(1<<i)<=n;i++){ 32 int m=1<<i; 33 c wn=c(cos(f*2*PI/m),sin(f*2*PI/m)); 34 for(int k=0;k<n;k+=m){ 35 c w=c(1,0); 36 for(int j=0;j<m/2;j++){ 37 c u=F[k+j]; 38 c t=w*F[k+j+m/2]; 39 F[k+j]=u+t; 40 F[k+j+m/2]=u-t; 41 w*=wn; 42 } 43 } 44 } 45 for(int i=0;i<n&&f==-1;i++)F[i]/=n; 46 for(int i=0;i<n;i++)a[i]=F[i]; 47 } 48 49 50 char a[N],b[N]; 51 c A[150000],B[150000]; 52 int ans[150000]; 53 54 int main() 55 { 56 while(~scanf("%s%s", a,b)) 57 { 58 int len1=strlen(a),len2=strlen(b),n1=0,n2=0,n; 59 while((1 << n1) < len1)n1++; 60 while((1 << n2) < len2)n2++; 61 n = 1 << (max(n1, n2) + 1); 62 for(int i = 0; i < n; i++) 63 { 64 if(i < len1) A[i] = c(a[len1 - i - 1] - '0', 0); 65 else A[i] = c(0, 0); 66 if(i < len2) B[i] = c(b[len2 - i - 1] - '0', 0); 67 else B[i] = c(0, 0); 68 } 69 fft(A, n, 1); 70 fft(B, n, 1); 71 for(int i = 0; i < n; i++)A[i]*=B[i]; 72 fft(A, n, -1); 73 for(int i = 0; i < n; i++)ans[i] = (int)(A[i].real() + 0.5); 74 for(int i = 0; i < n - 1; i++)ans[i+1] += ans[i] / 10,ans[i] %= 10; 75 bool flag = 0; 76 for(int i = n - 1; i >= 0; i--) 77 { 78 if(ans[i]) printf("%d", ans[i]), flag = 1; 79 else if(flag || i == 0) printf("0"); 80 } 81 puts(""); 82 } 83 }