HDU - 4074 - Sum

先上题目:

Sum

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 206    Accepted Submission(s): 113


Problem Description
 

 

Sample Input
2
 

 

Sample Output
2
Hint
1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cases.
 
  2013多校第十场的其中一题,题意就是根据他给的公式求出结果,其实结果就等于2^(n-1),但是这里的n很大,用普通的快速幂解不出来。这里的解法有两种,一是用数论的某一条公式,另一种是这样的指数p可以写成p=p0p1p2p3p4p5p6p7p8···结果:
                                               ans0=1*(2^p0)%MOD;
                  ans1=ans0^10*2^(p1)%MOD;
                  ``````
  在这种情况下这种方法的速度比用普通的快速幂更快,只要在每一个求幂的位置都用快速幂就可以了。
 
上代码:
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAX 1000001
 4 #define MOD 1000000007
 5 using namespace std;
 6 
 7 char s[MAX];
 8 
 9 void Sub(int &len)
10 {
11     int i;
12     if(s[len-1]>'0') s[len-1]--;
13     else
14     {
15         for(i=len-1;i>=0 && s[i]=='0';i--) s[i]='9';
16         s[i]--;
17         if(s[i]=='0'){s[i]='9'; len--;s[len]='\0';}
18         //if(len==0){s[0]='0';len=1;}
19     }
20 
21 }
22 
23 long long Fast_Mod(long long a,int p)
24 {
25     if(p==0) return 1;
26     if(p==1) return a%MOD;
27     long long t=Fast_Mod(a,p>>1);
28     t=t*t%MOD;
29     if(p&1) t=t*a%MOD;
30     return t;
31 }
32 
33 int main()
34 {
35     int i,len,t;
36     long long ans;
37     //freopen("data.txt","r",stdin);
38     while(scanf("%s",s)!=EOF)
39     {
40         len=strlen(s);
41         Sub(len);
42         ans=1;
43         //printf("%s\n",s);
44         for(i=0;i<len;i++)
45         {
46             t=s[i]-'0';
47             ans=Fast_Mod(ans,10);
48             ans=ans*Fast_Mod(2,t)%MOD;
49         }
50         printf("%I64d\n",ans);
51     }
52     return 0;
53 }
4074

 

posted @ 2013-08-22 21:28  海拉鲁的林克  阅读(305)  评论(0编辑  收藏  举报