zoukankan      html  css  js  c++  java
  • 快速幂算法

    快速幂算法

    之前听过快速幂,似懂非懂,不明觉厉……

    今天洛谷智能推荐了一道快速幂的模板题,写了半天还是看题解过的……

    Part1

    对指数进行二进制拆分

    当然不用真的拆,只是用位运算即可。

    主要是两个位运算:

    >>和&

    右移和按位与

    右移就相当于除以二,但是速度更快,是在二进制下将所有位向右移动一些位。

    按位与则是对两个操作数的每一位分别与,一个数&1就是它的最低位,可以快速的判断奇偶性。

    Part2

    公式(套路)

    (图片来源自互联网)

    如果p为奇数

      当前答案乘以底数

    p除以2

    底数自乘

    继续判断奇偶,直到p等于0

    Attention

    如果数据较大,记得取模

    最好每算一步,就取一次模

    所有数据最好都开long long,以防还没有取模就溢出了

    答案最后再取一次模(以防像计算1^0 mod 1这样的式子,因为没有进行快速幂而跳过取模)

    Problem

    P1226 【模板】快速幂||取余运算

    Solution

    不就是我嘛……

    Code

    #include<iostream>
    using namespace std;
    long long b,p,k,ans;
    int main()
    {
        cin>>b>>p>>k;
        cout<<b<<"^"<<p<<" mod "<<k<<"=";//先输出,比较方便
        ans=1;
        while(p>0)
        {
            if(p&1)
                ans*=b;
            p>>=1;
            b*=b;
            b%=k;
            ans%=k;
        }
        cout<<ans%k;
        return 0;
    }

    End

  • 相关阅读:
    2016去哪儿编程题:乘坐公交
    lintcode:交错正负数
    lintcode:Ugly Number I
    KMP算法
    适配器模式
    迭代器模式
    命令模式
    外观模式
    工厂方法模式
    代理模式
  • 原文地址:https://www.cnblogs.com/send-off-a-friend/p/11408476.html
Copyright © 2011-2022 走看看