【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 }
51nod 1028

 

posted @ 2017-10-25 07:25  Child-Single  阅读(741)  评论(0编辑  收藏  举报