51Nod - 1013 3的幂的和
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; }