1. 程式人生 > >51Nod 1013 3的冪的和 快速冪+逆元

51Nod 1013 3的冪的和 快速冪+逆元

求:3^0 + 3^1 +...+ 3^(N) mod 1000000007

收起

輸入

輸入一個數N(0 <= N <= 10^9)

輸出

輸出:計算結果

輸入樣例

3

輸出樣例

40

 等比數列求和公式:

Sum=a1*(1-q^n)/(1-q),所以可以轉化為:

Sum=(3^(n+1)-1)/2;

因為數太大,需要利用逆元來代替/2運算。

因為2與1000000007互質,所以可以利用公式2^(Mod-2)求出逆元。

所以最終公式為:

Sum=(3^(n+1)-1)*(2^(Mod-2))%Mod;

套用快速冪求出答案。

程式碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
const ll Mod=1000000007;
ll n;
ll Fast (ll a,ll b)
{
    ll sum=1;
    while (b)
    {
        if(b&1)
        {
            sum=sum*a%Mod;
        }
        a=a*a%Mod;
        b/=2;
    }
    return sum;
}
int main()
{
    scanf("%lld",&n);
    ll re=(Fast(3,n+1)-1)*Fast(2,Mod-2)%Mod;
    printf("%lld\n",re);
    return 0;
}