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; }