四川省选不考我就一直没没管,现在要抓起来了
抄黄学长的版,把他改快了不少,能凑活着用了
这个板是做高精度乘法的
//Copyright(c)2016 liuchenrui
#include<bits/stdc++.h>
#define pi 3.1415926535897932384626
using namespace std;
inline void splay(int &v){
v=0;char c=0;int p=1;
while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();}
while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();}
v*=p;
}
struct E{
double a,b;
friend E operator + (const E &a,const E &b){return (E){a.a+b.a,a.b+b.b};}
friend E operator - (const E &a,const E &b){return (E){a.a-b.a,a.b-b.b};}
friend E operator * (const E &a,const E &b){return (E){a.a*b.a-a.b*b.b,a.b*b.a+a.a*b.b};}
};
E a[500010],b[500010];
char s[500010];
int R[500010],L,n,m,c[500010];
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 wx=(E){cos(pi/i),f*sin(pi/i)};
for(int j=0;j<n;j+=(i<<1)){
E w=(E){1,0};
for(int k=0;k<i;k++,w=w*wx){
E x=a[j+k],y=w*a[i+j+k];
a[j+k]=x+y,a[i+j+k]=x-y;
}
}
}
if(f==-1)for(int i=0;i<n;i++)a[i].a/=n;
}
int main(){
freopen("xxx.in","r",stdin);
freopen("xxx.out","w",stdout);
scanf("%s",s);n=strlen(s)-1;
for(int i=0;i<=n;i++)a[n-i].a=s[i]-'0';
scanf("%s",s);m=strlen(s)-1;
for(int i=0;i<=m;i++)b[n-i].a=s[i]-'0';
n=max(n,m);m=n*2;
for(n=1;n<=m;n<<=1)L++;
for(int i=1;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]=a[i]*b[i];
FFT(a,-1);
for(int i=0;i<=m;i++)c[i]=(int)(a[i].a+0.5);
for(int i=0;i<=m;i++){
if(c[i]>=10){
c[i+1]+=c[i]/10;
c[i]%=10;
}
if(i+1==m&&c[i+1])m++;
}
for(int i=m-1;i>=0;i--){
putchar(c[i]+'0');
}
}