记录编号 |
221478 |
评测结果 |
AAAAAAAAAAAA |
题目名称 |
增强的乘法问题 |
最终得分 |
100 |
用户昵称 |
/k |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.003 s |
提交时间 |
2016-01-23 18:23:46 |
内存使用 |
27.61 MiB |
显示代码纯文本
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
using namespace std;
struct u
{
double r;
double i;
}A[530010],B[530010],C[530010];
char s1[530010],s2[530010];
int pr[530010];
int l1,l2,l,n=1,rg;
//#define pi 3.14159265358979
const double pi=acos(-1);
u operator - (u aa,u bb)
{
return (u){aa.r-bb.r,aa.i-bb.i};
}
u operator + (u aa,u bb)
{
return (u){aa.r+bb.r,aa.i+bb.i};
}
u operator *(u aa,u bb)
{
return (u){aa.r*bb.r-aa.i*bb.i,aa.r*bb.i+aa.i*bb.r};
}
inline void gfft(u *a,int b)
{
for(int i=0,j=0;i<n;i++)
{
if(i>j)
swap(a[i],a[j]);
for(int t=n>>1;(j^=t)<t;t>>=1);
}
int m=2;
u wn,w,t,uu;
for(int cs=1;cs<=rg;cs++,m<<=1)
{
wn=(u){cos(2.0*pi/m),b*sin(2.0*pi/m)};
w=(u){1,0};
for(int i=0;i<n;i+=m,w=(u){1,0})
{
for(int k=0,p=m>>1;k<p;k++,w=w*wn)
{
t=w*a[i+k+(m>>1)];
uu=a[i+k];
a[i+k]=uu+t;
a[i+k+(m>>1)]=uu-t;
}
}
}
if(b==-1)
for(int i=0;i<n;i++)
a[i].r/=n;
}
int main()
{
freopen("mul.in","r",stdin);
freopen("mul.out","w",stdout);
scanf("%s%s",s1,s2);
l1=strlen(s1),l2=strlen(s2);
l=max(l1,l2);
for(int i=l1-1;i>=0;i--)
A[l1-i-1].r=s1[i]-'0';
for(int i=l2-1;i>=0;i--)
B[l2-i-1].r=s2[i]-'0';
for(n=1;n<(l<<1);rg++,n<<=1);
gfft(A,1);
gfft(B,1);
for(int i=0;i<n;i++)
C[i]=A[i]*B[i];
gfft(C,-1);
for(int i=0;i<n;i++)
pr[i]=(int)(C[i].r+0.5);
for(int i=0;i<n;i++)
if(pr[i]>9)
{
pr[i+1]+=pr[i]/10;
pr[i]%=10;
}
bool p=0;
for(int i=n;i>=0;i--)
{
if(pr[i])
p=1;
if(p)
putchar(pr[i]+48);
}
if(!p)
puts("0");
}