51Nod - 1013 3的幂的和
求:3^0 + 3^1 +...+ 3^(N) mod 1000000007
Input
输入一个数N(0 <= N <= 10^9)
Output
输出:计算结果
Input示例
3
Output示例
40
题解:
这道题的解体方法很多。
有公式法,直接利用等比数列求和公式(用long long类型保存才行。)
有快速迭代幂算法。本题解就是采用较笨的方法。
#include <iostream>
#include <vector>
using namespace std;
const int MOD = 1e9 + 7;
vector<vector<long long> > multiple(const vector<vector<long long> >& a, const vector<vector<long long> >& b){
vector<vector<long long> > ans(a.size(), vector<long long>(b[0].size(), 0) );
for(int i=0; i<a.size(); ++i){
for(int j=0; j<b[0].size(); ++j){
for(int k=0; k<a[0].size(); ++k){
ans[i][j] += (a[i][k]*b[k][j]) % MOD;
ans[i][j] = ans[i][j] % MOD;
}
}
}
return ans;
}
vector<vector<long long> > Pow(vector<vector<long long> > M, int p){
vector<vector<long long> > ans = M;
p--;
while(p > 0){
if(p%2 == 1){
ans = multiple(ans, M);
}
M = multiple(M, M);
p = p/2;
}
return ans;
}
int main(){
// freopen("in.txt", "r", stdin);
int N, ans;
vector<vector<long long> > t(2, vector<long long>(2, 0));
t[0][0] = 3; t[0][1] = 1;
t[1][0] = 0; t[1][1] = 1;
while(scanf("%d", &N) != EOF){
if(N <= 0){
ans = 1;
}else{
vector<vector<long long> > tg = Pow(t, N);
ans = int((tg[0][0]*1 + tg[0][1]*1) % MOD);
}
printf("%d\n", ans );
}
return 0;
}