四川省选不考我就一直没没管,现在要抓起来了
抄黄学长的版,把他改快了不少,能凑活着用了
这个板是做高精度乘法的
//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'); } }