51nod 1013 3的幂的和(等比数列求和_快速幂+逆元)


求:3^0 + 3^1 +...+ 3^(N) mod 1000000007
Input
输入一个数N(0 <= N <= 10^9)
Output
输出:计算结果
Input示例
3
Output示例
40

关于逆元的一些知识点:

若对于数字A,C 存在X,使A * X = 1 (mod C) ,那么称X为 A 对C的乘法逆元。

逆元的作用?让我们来看下面的例子:
12 / 4 mod 7 = ? , 很显然结果是3
我们现在对于数对 (4,7), 可以知道 X = 2是 4 对7的乘法逆元即2*4=1(mod 7)
那么我们有(12 / 4) * (4 * 2 ) = (?) * (1) (mod 7)
除法被完美地转化为了乘法
理论依据:
F / A mod C = ?
如果存在 A*X = 1 (mod C)
那么2边同时乘起来,得到 F * X = ? (mod C)
成立条件
(1) 模方程 A * X = 1(mod C) 存在解
(2) A | F (F % A == 0)
以下来百度百科:
若ax=1 mod f 则称a关于模f的乘法逆元为x。也可表示为ax≡1(mod f)。
  当a与f互素时,a关于模f的乘法逆元有唯一解。如果不互素,则无解。如果f为素数,则从1到f-1的任意数都与f互素,即在1到f-1之间都恰好有一个关于模f的乘法逆元。
  例如,求5关于模14的乘法逆元:
  14=5*2+4
  5=4+1
  说明5与14互素,存在5关于14的乘法逆元。
  1=5-4=5-(14-5*2)=5*3-14
  因此,5关于模14的乘法逆元为3。










#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=1000000007;
typedef long long ll;
ll mod_pow(ll x,ll n)
{
	int first=1;
	ll res=1;
	while(n>0) {
		if(n&1) res=res*x%mod;
		x=x*x%mod;
		n>>=1;
	}
	return res;
} 
int main()
{
	
    ios::sync_with_stdio(false);
	ll n,ans;
	cin>>n;
	n++;
	ans=(mod_pow(3,n)-1)*500000004%mod;    //求2的逆元即可。。因为Sn=(a1-an*q)/(1-q)%mod 
	cout<<ans<<endl;
	return 0;
}





你可能感兴趣的:(51nod 1013 3的幂的和(等比数列求和_快速幂+逆元))