很有代表性的一道题,用到了快速幂和逆元
题干
求:3^0 + 3^1 +...+ 3^(N) mod 1000000007
快速幂
参考资料《基础算法—快速幂详解》
快速幂的原理是,计算m ^ k次方的时候,通过k的二进制值将k拆分成2^i + 2^j + ...,通过不断地平方运算快速计算m的k次方
逆元
这个真是个奇妙的东西
以1013题为例,整个证明过程如下:
原式 = [1 - 3^(n+1)] / (1 - 3) = [3^(n+1) - 1] / 2
[1] A = 3^(n+1) - 1
[2] B = 2
则原式 = A / B
设[3] (B * x) % C = 1
[4] C = mod
由[3][4]可得:
(B * x) % mod = 1
x = (mod + 1) / B [5]
由[2][5]可得
x = (mod + 1) / 2
原式 % mod = (A / B) % mod
= (A / B * B * x) % mod
= (A * x) % mod
完整代码
#include<iostream>
using namespace std;
int mod = 1000000007;
long long power3(int n){
long long res = 1;
long long k = 3;
while(n){
if(n & 1){
res = (res * k) % mod;
}
k = (k * k) % mod;
n /= 2;
}
return res;
}
int main(){
int n;
cin >> n;
long long a = power3(n + 1) - 1;
long long x = (mod + 1) / 2;
cout << (a * x) % mod << endl;
return 0;
}
网友评论