bzoj2179 bigint * fft

来源:互联网 发布:酷音铃声制作for mac 编辑:程序博客网 时间:2024/04/30 21:18

hzwer , not easy understand 

 

#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<algorithm>#include<queue>#include<complex>using namespace std;const double pi=acos(-1.0);typedef complex<double> E;char ch[60005];int n,m,L,R[150005],c[150005];E a[150005],b[150005];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*=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);n--;scanf("%s",ch);for (int i=0;i<=n;i++) a[i]=ch[n-i]-'0';scanf("%s",ch);for (int i=0;i<=n;i++) b[i]=ch[n-i]-'0';m=n*2;for (n=1;n<=m;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<=n;i++) c[i]=(int)(a[i].real()+0.1);for (int i=0;i<=m;i++)if (c[i]>=10){c[i+1]+=c[i]/10,c[i]=c[i]%10;if (i==m) m++;}for (int i=m;i>=0;i--) printf("%d",c[i]);return 0;}


 

0 0
原创粉丝点击