题意
求:3^0 + 3^1 +…+ 3^(N) mod 1000000007
解题思路
由等比数列的前n相和,我们可以得到
3n+1−12%1000000007
我们知道
AB%C≠A%CB%C%C
和
(A∗B)%C=(A%C∗B%C)%C
所以我们要将除法转为乘法,引入乘法逆元。
乘法逆元:如果x与y的积除以z所得的余数为1,即xy = 1 (mod z),则称x和y对于模数z来说互为逆元。
假定
(B∗X)%C=1
则
AB%C=AB∗1%C=AB%C∗1%C=AB%C∗(B∗X)%C=(AB∗B∗X)%C=(A∗X)%C
在本题中,2*500000004 = 1 (mod 1000000007),所以500000004是2对于1000000007的逆元。则
3n+1−12%1000000007=(3n+1−1)∗500000004%1000000007
对于
ab%c
,采用快速幂运算即可。
参考代码
#include <iostream>
using namespace std;
typedef long long ll;
ll MOD = 1000000007;
ll mod_pow(ll n){
ll k=3,ans=1;
while (n){
if (n&1) ans=(ans*k)%MOD;
n/=2;
k=(k*k)%MOD;
}
return ans;
}
int main(){
ll n;
while (cin>>n){
ll ans=((mod_pow(n+1)-1)*500000004)%MOD;
cout<<ans<<endl;
}
return 0;
}