题目
1202: 3的幂的和
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 345 Solved: 32
[Submit][Status][Web Board]
Description
求:3^0 + 3^1 +…+ 3^(N) mod 1000000007。
Input
每行一个整数N(0 <= N <= 10^9)
Output
输出:计算结果
Sample Input
3
Sample Output
40
HINT
(a/b)%c=(a%(b*c))/b (a 能整除b)
想法
题目很简单,重点是HINT里提醒到 (a/b)%c=(a%(b*c))/b (a 能整除b)
这个在哪里派上用场呢?
我们先写等比数列通项公式:
得到
但这还不够。
根据定理 如果x与y的积除以z所得的余数为1,那么有x*y = 1 (mod 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
那么可以推导得到{ ((3^(n+1) - 1) / 2) % 1000000007 = (3^(n+1)−1)∗500000004%1000000007}
幂乘直接套用快速幂模版
AC代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define m(x) memset(x,0,sizeof x)
const double PI = acos(-1);
const int maxn = 110;
const long long mod = 1000000007;
typedef long long ll;
ll power(ll a,ll b)
{
ll ans = 1;
while(b!=0){
if(b&1)
{
ans *= a%mod;
ans %= mod;
}
b>>=1;
a = (a%mod) * (a % mod) % mod;
}
return ans;
}
int main()
{
ll ans,n;
while(~scanf("%lld",&n))
{
ans = ((power(3, n+1) - 1) * 500000004) % mod;
printf("%lld\n",ans);
}
return 0;
}