zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    WebService发布到IIS
    MongDb的安装
    Linux shell编程— 命令替换
    Linux软件包管理
    Linux 管理进程
    Linux 中进程的管理
    JavaScript学习day3 (基本语法下)
    JavaScript学习day2 (基本语法上)
    JavaScript学习day1
    Python 学习
  • 原文地址:https://www.cnblogs.com/kirin1105916774/p/12687214.html
Copyright © 2011-2022 走看看