求:3^0 + 3^1 +...+ 3^(N) mod 1000000007
收起
输入
输入一个数N(0 <= N <= 10^9)
输出
输出:计算结果
输入样例
3
输出样例
40
等比数列求和公式:
Sum=a1*(1-q^n)/(1-q),所以可以转化为:
Sum=(3^(n+1)-1)/2;
因为数太大,需要利用逆元来代替/2运算。
因为2与1000000007互质,所以可以利用公式2^(Mod-2)求出逆元。
所以最终公式为:
Sum=(3^(n+1)-1)*(2^(Mod-2))%Mod;
套用快速幂求出答案。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
const ll Mod=1000000007;
ll n;
ll Fast (ll a,ll b)
{
ll sum=1;
while (b)
{
if(b&1)
{
sum=sum*a%Mod;
}
a=a*a%Mod;
b/=2;
}
return sum;
}
int main()
{
scanf("%lld",&n);
ll re=(Fast(3,n+1)-1)*Fast(2,Mod-2)%Mod;
printf("%lld\n",re);
return 0;
}