zoukankan      html  css  js  c++  java
  • 模板:快速幂

    是的我要痛心疾首的写一遍快速幂的模板……原本以为这玩意很简单的,然而事实证明……
    板子都背错了还说啥?(实际上板子从一开始写的就不对……)
    好的那我们开始吧。
    ————————————
    勇者最近发现怪物们的行为异常了起来。
    这其中异常的大概是积木怪,原本互相分散的他们竟然开始朝着一个方向去集合。
    “莫非……”勇者想到了可怕的想法,那是三十年一次的。
    “积木怪攻城!”

    (瞎编题时间)
    已知积木怪的数量为n,他们的个体攻击力为2,但是n个积木怪叠加起来的话,他们的总攻击力就会变成可怕的2的n次幂。
    不过好在积木怪这种没脑子的家伙罗高了就会倒塌,经过古代贤者对于这种生物的考究,这种生物的攻击力始终不会超过1e9+7,因此你只需要把结果对1e9+7取模即可。
    ————————————
    “其实积木怪挺善良的……要是换做别的组合怪的话,可能就要用到高精度了……”路由器一边嘟囔着,看着勇者用c++魔法语言自带的pow函数去清理小怪——毫不费事。
    “等等,什么时候出来了这么大的怪……快算啊pow……”
    【提示:您的体力值为0,已经自动回城】
    “什么鬼?计算出来的结果这么大……”
    回城后,pow憋了五六秒的时间才给出了结果,这令勇者十分的沮丧。
    “没事,我们还有一招!”
    路由器将勇者带到了照相馆那里,很轻易翻到了一本魔法书。
    “快速幂”
    “快速幂采用二分的思想,对于任意的k的n次幂,如果n为偶数,那么就等于k^(n/2)*k^(n/2),如果为奇数则再多乘以k即可。”
    “利用递归的思想,我们很容易写出如下的代码。”

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<string>
    #include<algorithm>
    using namespace std;
    const long long q=1e9+7;
    long long qpow(long long k,long long n){
        if(n==0)return 1;
        if(n==1)return k;
        long long p=qpow(k,n/2)%q;
        if(n%2==0)return p%q*p%q;
        else return p%q*p%q*k%q;
    }
    int main(){
        int n;
        scanf("%d",&n);
        printf("%lld",qpow(2,n)%q);
        return 0;
    }
    

    “怎样,是不是很简单啊!”

  • 相关阅读:
    LeetCode 面试题32
    LeetCode 102. 二叉树的层序遍历
    LeetCode 面试题32
    LeetCode 面试题32
    LeetCode 面试题31. 栈的压入、弹出序列
    LeetCode 946. 验证栈序列
    LeetCode 50. Pow(x, n)
    LeetCode 572. 另一个树的子树
    LeetCode 面试题50. 第一个只出现一次的字符
    LeetCode 面试题37. 序列化二叉树
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/7706032.html
Copyright © 2011-2022 走看看