LeetCode

[51Nod]1013 3的幂的和

2019-08-08  本文已影响0人  闭门造折

很有代表性的一道题,用到了快速幂和逆元

题干

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

快速幂

参考资料《基础算法—快速幂详解》
快速幂的原理是,计算m ^ k次方的时候,通过k的二进制值将k拆分成2^i + 2^j + ...,通过不断地平方运算快速计算m的k次方

逆元

这个真是个奇妙的东西
以1013题为例,整个证明过程如下:

    原式 = [1 - 3^(n+1)] / (1 - 3) = [3^(n+1) - 1] / 2
[1] A = 3^(n+1) - 1
[2] B = 2
    则原式 = A / B
    设[3] (B * x) % C = 1
[4] C = mod
    由[3][4]可得:
(B * x) % mod = 1
            x = (mod + 1) / B [5]
    由[2][5]可得
x = (mod + 1) / 2
原式 % mod = (A / B) % mod
           = (A / B  *  B * x) % mod
           = (A * x) % mod 

完整代码

#include<iostream>

using namespace std;

int mod = 1000000007;
long long power3(int n){
    long long res = 1;
    long long k = 3;
    while(n){
        if(n & 1){
            res = (res * k) % mod;
        }
        k = (k * k) % mod;
        n /= 2;
    }
    return res;
}
int main(){
    int n;
    cin >> n;
    long long a = power3(n + 1) - 1;
    long long x = (mod + 1) / 2;
    cout << (a * x) % mod << endl;
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读