[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 }  
View Code

 

posted @ 2017-02-07 11:06  KingSann  阅读(105)  评论(0)    收藏  举报