【51nod1028】大数乘法 V2 问题——压位
本来是应该用FFT的,但是我不会......
于是就直接把每六位压成一位上高精乘就好啦。
不过注意由于取模操作常数巨大,不能每次都执行,应该是全部做完从后往前扫一遍进位。
然后就O(len2)过2万><
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 typedef long long LL; 5 using std::max; 6 const int N=1e5+10,mod=1e6; 7 char ch[N],tt[N]; 8 int tot=0,sum=0; 9 LL ans[N],a[N],b[N]; 10 int le,len; 11 int main(){ 12 scanf("%s %s",ch+1,tt+1); 13 le=strlen(ch+1);len=strlen(tt+1); 14 for(int i=le;i>=1;i-=6){ 15 int pp=0; 16 for(int j=max(1,i-5);j<=i;j++)pp=pp*10+ch[j]-48; 17 a[++tot]=pp; 18 } 19 for(int i=len;i>=1;i-=6){ 20 int pp=0; 21 for(int j=max(1,i-5);j<=i;j++)pp=pp*10+tt[j]-48; 22 b[++sum]=pp; 23 } 24 for(int i=1;i<=sum;i++) 25 for(int j=1;j<=tot;j++) 26 ans[i+j-1]+=b[i]*a[j]; 27 for(int i=1;i<=sum+tot-1;i++){ 28 LL p=ans[i]/mod; 29 ans[i+1]+=p; 30 ans[i]%=mod; 31 } 32 bool flag=0; 33 for(int i=sum+tot;i>=1;i--){ 34 if(!flag&&!ans[i])continue; 35 if(!flag)printf("%lld",ans[i]),flag=1; 36 else printf("%06lld",ans[i]); 37 } 38 return 0; 39 }