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;
}
原文地址:https://www.cnblogs.com/kirin1105916774/p/12687214.html