快速幂
基本思想
‘’’
3 ^ 11 = ?
11 = 1011
3 ^ 1 = 3
3 ^ 2 = 9
3 ^ 4 = 81
3 ^ 8 = 6561
3 ^ 11 = 3 * 9 * 6561;
‘’’
第一种:
当数据范围m,k,p <= 10^9
int qmi(int m, int k, int p){
int res = 1 % p, t = m;
while(k){
if(k&1) res = res * t % p;
t = t * t % p;
k >>= 1;
}
return res;
}
值得一提:
k >> = 1 “除以2向0取整”
详细可以看状态压缩dp(内含位运算)
快速幂求逆元
逆元定义
若整数b,m互质,并且对于任意的整数 a,如果满足b|a,则存在一个整数x,使得a/b≡a∗x(mod m),则称x为b的模m乘法逆元,记为
b
−
1
(
m
o
d
m
)
b^{−1}(mod m)
b−1(modm)。
b存在乘法逆元的充要条件是b与模数m互质。当模数m为质数时,
b
m
−
2
b^{m−2}
bm−2即为b的乘法逆元。
#include <iostream>
using namespace std;
typedef long long LL;
LL qmi(LL b, LL m, LL p){
LL res = 1 % p;
while(m){
if(m&1) res = res * b % p;
b = b * b % p;
m >>= 1;
}
return res;
}
int main(){
int t;
cin >> t;
while(t--){
int b, m;
cin >> b >> m;
int res = qmi(b, m-2, m);
if(b % m) cout << res % m << endl;
else cout << "impossible" << endl;
}
return 0;
}