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 }