先上题目:
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]='