求:3^0 + 3^1 +...+ 3^(N) mod 1000000007
Input
输入一个数N(0 <= N <= 10^9)
Output
输出:计算结果
Sample Input
3
Sample Output
40
题解:这道题如果从3的0次幂到3的n次幂的暴力的加一遍的话,肯定会超时,这时候我们就要用到一点小技巧了,
我们可以很容易的看出:前一部分是一个等比数列,首项a1为1,公比q为3,根据等比数列的求和公式:Sn=a1(1-q^n)/(1-q),
我们可以得到左半部分的和是:(3^(n-1)-1)/2 ,所以这个题就转化成了求:(3^(n-1)-1)/2 mod 1000000007 .
除以一个数mod另一个数又等于乘以这个数的逆元,即求(3^(n-1)-1)*inv(2) mod 1000000007.
我们令a为(3^(n-1)-1),令b为2,令c为2的逆元,所以答案为:ans=a*c%1000000007.
代码如下:
#include <bits/stdc++.h>
#define mod 1000000007
using namespace std;
typedef long long ll;
ll quickpow(ll a,ll b){
ll res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main(){
ll n;
scanf("%lld",&n);
ll ans,a,b=2,c;
a=quickpow(3,n+1)-1;
c=quickpow(b,mod-2);
ans=a*c%mod;
printf("%lld\n",ans);
return 0;
}