bzoj2179(fft模板)

来源:互联网 发布:网络教育 概念股 编辑:程序博客网 时间:2024/04/30 18:56

大整数乘法

 

#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<algorithm>#include<complex>#include<set>using namespace std;typedef complex<double> E;const double pi=acos(-1.0);const int N=150005;int n,m,L,c[N],R[N];E a[N],b[N],tmp[N];char ch[N];void fft(E *a,int f){for (int i=0;i<n;i++) if (i<R[i])swap(a[i],a[R[i]]);for (int i=1;i<n;i<<=1){E wn(cos(pi/i),f*sin(pi/i));for (int j=0;j<n;j+=i<<1){E w(1,0);for (int k=0;k<i;k++,w=w*wn){E x=a[j+k],y=w*a[j+k+i];a[j+k]=x+y;a[j+k+i]=x-y;}}}if (f==-1) for (int i=0;i<n;i++) a[i]/=n;}int main(){scanf("%d",&n);scanf("%s",ch);for (int i=0;i<n;i++) a[i]=ch[n-i-1]-'0';scanf("%s",ch);for (int i=0;i<n;i++) b[i]=ch[n-i-1]-'0';m=n*2;while ((1<<L)<m) L++;n=1<<L;for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));fft(a,1);fft(b,1);for (int i=0;i<n;i++) a[i]*=b[i];fft(a,-1);for (int i=0;i<m;i++) c[i]=(int)(a[i].real()+0.1);while (c[m]<=0&&m>0) m--;for (int i=0;i<=m;i++) c[i+1]+=c[i]/10,c[i]=c[i]%10;while (c[m+1]) m++,c[m+1]=c[m]/10,c[m]=c[m]%10; for (int i=m;i>=0;i--) printf("%d",c[i]);return 0;  }


 

0 0
原创粉丝点击