【CodeVS 3123】 高精度练习之超大整数乘法

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 }

你可能感兴趣的:(【CodeVS 3123】 高精度练习之超大整数乘法)