30行高精乘

强势压行...

#include<bits/stdc++.h>
#define pi acos(-1)
using namespace std;
typedef complex <double> E;
string s1,s2;
int n,m,w[500000],maxn=0;
E a[500000],b[500000];
void FFT(E *x,int n,int type){
	if(n==1)return;E l[n>>1],r[n>>1];
	for(int i=0;i<n;i+=2)l[i>>1]=x[i],r[i>>1]=x[i+1];
	FFT(l,n>>1,type);FFT(r,n>>1,type);
	E wn(cos(2*pi/n),sin(type*2*pi/n)),w(1,0),t;
	for(int i=0;i<n>>1;i++,w*=wn)t=r[i]*w,x[i]=l[i]+t,x[i+(n>>1)]=l[i]-t;
}
int main(){
	cin>>n;
	cin>>s1;n=s1.length();
	cin>>s2;m=s2.length();
	for(int i=0;i<n;i++)a[i]=s1[n-i-1]-'0';
	for(int i=0;i<m;i++)b[i]=s2[m-i-1]-'0';
	m=n+m;for(n=1;n<=m;n<<=1);FFT(a,n,1);FFT(b,n,1);
	for(int i=0;i<n;i++)a[i]=a[i]*b[i];FFT(a,n,-1);
	for(int i=0;i<n;i++)w[i]=(int)(a[i].real()/n+0.5);
	for(int i=0;i<n;i++)
	{
		if(w[i])maxn=i;w[i+1]+=w[i]/10;w[i]=w[i]%10;
	}
	for(int i=maxn;i>=0;i--)
		printf("%d",w[i]);
	printf("\n");
	return 0;
}

  

posted @ 2018-01-16 11:23  mybing  阅读(116)  评论(0编辑  收藏  举报