求:3^0 + 3^1 +...+ 3^(N) mod 1000000007
Input
输入一个数N(0 <= N <= 10^9)
Output
输出:计算结果
Input示例
3
Output示例
40
思路:
根据等比数列和的公式,本题的解为((3^(n+1) - 1) / 2) % 1000000007。
如果x与y的积除以z所得的余数为1,即xy = 1 (mod z),则称x和y对于模数z来说互为逆元。假定(B∗X)%C=1则
A/B%C=A/B∗1%C=A/B%C∗1%C=A/B%C∗(B∗X)%C=(A/B∗B∗X)%C=(A∗X)%C
在本题中,2*500000004 = 1 (mod 1000000007),所以500000004是2对于1000000007的逆元。则
(3^(n+1)−1)/2%1000000007=(3^(n+1)−1)∗500000004%1000000007
这样,就将除法运算转换为乘法运算。
#include <iostream>
#include <cstring>
using namespace std;
typedef long long int ll;
ll MOD = 1e9 + 7;
ll mod_pow(ll a, ll k)
{
ll base = a;
ll result = 1;
while (k > 0)
{
if (k & 1)
{
result = (result * base) % MOD;
}
k /= 2;
base = (base * base) % MOD;
}
return result;
}
int main()
{
ll n;
cin >> n;
ll result = ((mod_pow(3, n+1) - 1) * 500000004) % MOD;
cout << result << endl;
return 0;
}