求:3^0 + 3^1 +...+ 3^(N) mod 1000000007
Input
输入一个数N(0 <= N <= 10^9)
Output
输出:计算结果
Sample Input
3
Sample Output
40题解:
等比数列前(n+1)项和,公比为3首项为1所以t=( 3^(n+1)-1 ) / 2 % 1000000007。
3^(n+1)用快速幂解决,而除法取模只需将除法变乘法即可,也就是用被除数去乘以除数的乘法逆元。
求乘法逆元用费马小定理:当模为素数,a的逆元为myPow(a,mod-2)。
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; #define mod 1000000007 long long myPow(long long t,long long N){ long long mid = 1; while(N){ if(N&1){ mid *= t; mid %= mod; } t *= t; t %= mod; N >>= 1; } return mid; } int main(){ long long N; cin>>N; long long t = myPow(3,N+1)-1; t = (t*myPow(2,mod-2))%mod; cout<<t<<endl; return 0; }