[cogs1473]很强的乘法问题
QAQ再练一波。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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=1000000; 13 14 typedef complex<double> c; 15 c F[N],A[N],B[N]; 16 char a[N],b[N]; 17 int ans[N]; 18 19 int rev(int x,int n){ 20 int ret=0; 21 for(int i=0;(1<<i)<n;i++)ret=(ret<<1)|((x&(1<<i))>0); 22 return ret; 23 } 24 25 void fft(c *a,int n,int f){ 26 for(int i=0;i<n;i++)F[rev(i,n)]=a[i]; 27 for(int i=2;i<=n;i*=2){ 28 c wn=c(cos(2*acos(-1)*f/i),sin(2*acos(-1)*f/i)); 29 for(int j=0;j<n;j+=i){ 30 c w=1; 31 for(int k=j;k<j+i/2;k++){ 32 c u=F[k],t=w*F[k+i/2]; 33 F[k]=u+t; 34 F[k+i/2]=u-t; 35 w*=wn; 36 } 37 } 38 } 39 for(int i=0;i<n;i++)a[i]=(F[i]/=(f==-1?n:1)); 40 } 41 42 43 int main(){ 44 freopen("bettermul.in","r",stdin); 45 freopen("bettermul.out","w",stdout); 46 scanf("%s%s",a,b); 47 int l1=strlen(a),l2=strlen(b),n1=1,n2=1,n=1; 48 while(n1<=l1)n1*=2; 49 while(n2<=l2)n2*=2; 50 while(n<2*max(n1,n2))n*=2; 51 for(int i=0;i<n;i++)A[i]=(i<l1?a[l1-i-1]-'0':0); 52 for(int i=0;i<n;i++)B[i]=(i<l2?b[l2-i-1]-'0':0); 53 fft(A,n,1); 54 fft(B,n,1); 55 for(int i=0;i<n;i++)A[i]*=B[i]; 56 fft(A,n,-1); 57 for(int i=0;i<n;i++)ans[i]=int(A[i].real()+0.5); 58 for(int i=0;i<n-1;i++)ans[i+1]+=ans[i]/10,ans[i]%=10; 59 bool f=0; 60 for(int i=n-1;i>=0;i--)ans[i]?printf("%d",ans[i]),f=1:f||!i?printf("0"):0; 61 }