51Nod 1013 3的幂的和 经典模板题+思路详细讲解【等比数列+快速幂+逆元】

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

40    

题目大意&&解题思路:根据题目描述,即求一个a1为1,q为3的等比数列之和,公式为a1(1-q^n)/1-q ——>> (3^n-1)/2。

这里有两个点需要思考,1.如何快速求出3的高次幂 2.如何在保有3^n-1这一大数特性不变的情况下正确求出其除以2后取模的值。

针对问题1,我们使用快速幂,基本过程为将幂按位处理,在log(n)的时间复杂度内计算出3^n%(1e9+7)。

针对问题2,我们引入乘法逆元的概念,

关于逆元的一些知识点:若对于数字A,C 存在X,使A * X = 1 (mod C) ,那么称X为 A 对C的乘法逆元。对于F / A mod C = ?,当且仅当A与C互质时,X存在唯一解。例如本题,解2*X=1(mod 1000000007),X=(1000000007+1)/2=500000004,

这样便可以化除为乘,再利用乘法同余性质:(a*b)mod c = = (a mod c)*(b mod c),确保答案的正确性。

Here is my Code:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <map>
#include <cmath>
using namespace std;
const long long mod=1e9+7;
long long quickpow_mod(long long a,int  i,long long n)         
{
    long long k=a%n;
	long long sum=1;
    while(i)
    {
        if(i&1)
          sum=sum*k%n;
        k=k*k%n;
        i>>=1;
    }
   return sum;
}

int main(){
	int n;
	scanf("%d",&n);
	long long ans=0;
	ans=(quickpow_mod(3,n+1,mod)-1)*500000004%mod;
	cout<<ans<<endl;
}

猜你喜欢

转载自blog.csdn.net/qq_39665840/article/details/80113434