codevs 3123 高精度练习之超大整数乘法

时间:2022-05-20 18:24:17

fft。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<complex>
#include<cmath>
#include<algorithm>
#define maxn 300500
#define pi acos(-1)
using namespace std;
typedef complex<double> E;
char s[maxn];
int l1,l2,n=,m,l=,c[maxn],r[maxn];
E a[maxn],b[maxn];
void fft(E *x,int f)
{
for (int i=;i<n;i++)
if (i<r[i]) swap(x[i],x[r[i]]);
for (int i=;i<n;i<<=)
{
E wn(cos(pi/i),f*sin(pi/i));
for (int j=;j<n;j+=(i<<))
{
E w(,);
for (int k=;k<i;k++)
{
E r1,r2;
r1=x[j+k];r2=w*x[i+j+k];
x[j+k]=r1+r2;x[i+j+k]=r1-r2;
w*=wn;
}
}
}
if (f==-)
{
for (int i=;i<n;i++)
x[i]/=n;
}
}
int main()
{
scanf("%s",s);
l1=strlen(s)-;n=max(n,l1);
for (int i=;i<=l1;i++) a[i].real()=s[l1-i]-'';
scanf("%s",s);
l2=strlen(s)-;n=max(n,l2);
for (int i=;i<=l2;i++) b[i].real()=s[l2-i]-'';
m=*n;
for (n=;n<=m;n<<=) l++;
for (int i=;i<n;i++) r[i]=(r[i>>]>>)|((i&)<<(l-));
fft(a,);fft(b,);
for (int i=;i<n;i++) a[i]*=b[i];
fft(a,-);
for (int i=;i<=m;i++)
c[i]=(int)(a[i].real()+0.1);
int flag=;
for (int i=;i<=m;i++)
{
if (c[i]>=)
{
c[i+]+=c[i]/;
c[i]%=;
if (i==m) m++;
}
}
int p=m;while (c[p]==) p--;
for (int i=p;i>=;i--) printf("%d",c[i]);
printf("\n");
return ;
}