美文网首页LeetCode
[51Nod]1013 3的幂的和

[51Nod]1013 3的幂的和

作者: 闭门造折 | 来源:发表于2019-08-08 23:15 被阅读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;
    }
    

    相关文章

      网友评论

        本文标题:[51Nod]1013 3的幂的和

        本文链接:https://www.haomeiwen.com/subject/ubdfjctx.html