• 1.快速幂


    1.快速幂

    37=?

    【析】7 = 111

       31 =3

       32 =9

       34 =81

       ……

       32^(n-1)   --n:二进制位数  0~n-1

       所以37=3×9×81

    【例1】ab     https://www.acwing.com/problem/content/91/

    #include <iostream>
    using namespace std;
    int main(){
        int a,b,p;
        cin>>a>>b>>p;
        int res = 1 % p;    //答案
        while(b){
            if(b&1) res = res * 1ll * a % p; //从b的个位开始考虑,如果b个位是1,则res*a
                                //1ll:longlong型整数1,防止溢出
                            //先对乘数因子取模再运算不影响结果,(a * b) % p = (a % p * b % p) % p
    a = a * 1ll * a % p; //十位:不断平方 b >>= 1; //b右移1位,去掉个位 //6>>1就是把00000110右移一位变为00000011 } cout << res << endl; return 0; }

    2、乘法快速幂

    3 * 7 = ?

    【析】7 = 111

    3 * 1 = 3

    3 * 2 = 6

    3 * 4 = 12

    3 * 8 = 24

    ……

    a * (2k-1) = 2k-1 * a   --k:二进制位数  0~k-1

    【例2】64位整数乘法   https://www.acwing.com/problem/content/92/

     

    #include <iostream>
    using namespace std;
    typedef unsigned long long ULL;
    int main(){
        ULL a,b,p;
        cin >> a >> b >> p;
        ULL res = 0; //答案
        while(b){
            if(b & 1) res = (res + a) % p; //从b的个位开始考虑,如果b个位是1,则res+a*1
                                           //先对加数因子取模再运算不影响结果,(a + b) % p = (a % p + b % p) % p
            b >>= 1; //b右移1位,去掉个位
                     //6>>1就是把00000110右移一位变为00000011
            a = a * 2 % p; //十位:不断平方 a=2
        }
        cout << res << endl;
        return 0;
    }
  • 相关阅读:
    Winfrom 动画实现
    Android-SD卡相关操作
    Android-动态权限获取
    Java 常用知识点
    无锁队列的实现
    稳定的快排
    设计模式
    map的线程安全
    win 消息
    memecpy源码
  • 原文地址:https://www.cnblogs.com/kirin1105916774/p/12687214.html
Copyright © 2020-2023  润新知