RE了2发 init竟然会开小.......
1 #include <cstdio>
2 #include <algorithm>
3 #include <complex>
4 #include <iostream>
5 #include <cmath>
6 using namespace std;
7 const double PI= acos(- 1);
8 int init[ 100000* 4+ 10];
9 #define C complex<double>
10 C a[ 100000* 4+ 1],b[ 100000* 4+ 1];
11 int n,m,rev[ 100000* 4];
12 void FFT(C a[], int type)
13 {
14 for( int i= 0;i<n;i++) if(rev[i]<i) swap(a[rev[i]],a[i]);
15 for( int i= 2;i<=n;i<<= 1)
16 {
17 C wn(cos( 2*PI/i),type*sin( 2*PI/i));
18 for( int j= 0;j<n;j+=i)
19 {
20 C w( 1, 0),x,y;
21 for( int k= 0;k<i/ 2;k++)
22 {
23 x=a[j+k];
24 y=a[j+k+i/ 2]*w;
25 a[j+k]=x+y;
26 a[j+k+i/ 2]=x-y;
27 w=w*wn;
28 }
29 }
30 }
31 }
32 int main()
33 {
34 // freop0en("a.in","r",stdin);
35 char c=getchar();
36 while(c!= ' ') init[++n]=c- ' 0 ',c=getchar();
37 for( int i=n;i>= 1;i--) a[n-i]=init[i];
38 c=getchar();
39 while(c!= ' \n ') init[++m]=c- ' 0 ',c=getchar();
40 for( int i=m;i>= 1;i--) b[m-i]=init[i];
41
42 n--,m--;
43 // for(int i=0;i<=n;i++) cout<<a[i]<<' ';cout<<endl;
44 // for(int i=0;i<=m;i++) cout<<b[i]<<' ';cout<<endl;
45 m=n+m; int L= 0;
46 for(n= 1;n<=m;n<<= 1)L++; L--;
47 for( int i= 0;i<n;i++) rev[i]=((rev[i>> 1]>> 1)|((i& 1)<<L));
48
49 FFT(a, 1);FFT(b, 1);
50 for( int i= 0;i<n;i++) a[i]*=b[i];
51 FFT(a,- 1);
52 for( int i= 0;i<=m;i++) init[i]=( int)(a[i].real()/n+ 0.5); // ,cout<<init[i]<<' ';cout<<endl;
53 init[m+ 1]= 0;
54 for( int i= 0;i<=m;i++) init[i+ 1]+=init[i]/ 10,init[i]%= 10; // ,cout<<init[i+1]<<' ';cout<<endl;
55 if(init[m+ 1]!= 0) m++;
56 for( int i=m;i>= 0;i--) printf( " %d ",init[i]);
57 return 0;
58 }
2 #include <algorithm>
3 #include <complex>
4 #include <iostream>
5 #include <cmath>
6 using namespace std;
7 const double PI= acos(- 1);
8 int init[ 100000* 4+ 10];
9 #define C complex<double>
10 C a[ 100000* 4+ 1],b[ 100000* 4+ 1];
11 int n,m,rev[ 100000* 4];
12 void FFT(C a[], int type)
13 {
14 for( int i= 0;i<n;i++) if(rev[i]<i) swap(a[rev[i]],a[i]);
15 for( int i= 2;i<=n;i<<= 1)
16 {
17 C wn(cos( 2*PI/i),type*sin( 2*PI/i));
18 for( int j= 0;j<n;j+=i)
19 {
20 C w( 1, 0),x,y;
21 for( int k= 0;k<i/ 2;k++)
22 {
23 x=a[j+k];
24 y=a[j+k+i/ 2]*w;
25 a[j+k]=x+y;
26 a[j+k+i/ 2]=x-y;
27 w=w*wn;
28 }
29 }
30 }
31 }
32 int main()
33 {
34 // freop0en("a.in","r",stdin);
35 char c=getchar();
36 while(c!= ' ') init[++n]=c- ' 0 ',c=getchar();
37 for( int i=n;i>= 1;i--) a[n-i]=init[i];
38 c=getchar();
39 while(c!= ' \n ') init[++m]=c- ' 0 ',c=getchar();
40 for( int i=m;i>= 1;i--) b[m-i]=init[i];
41
42 n--,m--;
43 // for(int i=0;i<=n;i++) cout<<a[i]<<' ';cout<<endl;
44 // for(int i=0;i<=m;i++) cout<<b[i]<<' ';cout<<endl;
45 m=n+m; int L= 0;
46 for(n= 1;n<=m;n<<= 1)L++; L--;
47 for( int i= 0;i<n;i++) rev[i]=((rev[i>> 1]>> 1)|((i& 1)<<L));
48
49 FFT(a, 1);FFT(b, 1);
50 for( int i= 0;i<n;i++) a[i]*=b[i];
51 FFT(a,- 1);
52 for( int i= 0;i<=m;i++) init[i]=( int)(a[i].real()/n+ 0.5); // ,cout<<init[i]<<' ';cout<<endl;
53 init[m+ 1]= 0;
54 for( int i= 0;i<=m;i++) init[i+ 1]+=init[i]/ 10,init[i]%= 10; // ,cout<<init[i+1]<<' ';cout<<endl;
55 if(init[m+ 1]!= 0) m++;
56 for( int i=m;i>= 0;i--) printf( " %d ",init[i]);
57 return 0;
58 }