876. 快速幂求逆元
给定 n 组 ai,pia_i,p_iai,pi,其中 pip_ipi 是质数,求 aia_iai 模 pip_ipi 的乘法逆元,若逆元不存在则输出 impossible。
注意:请返回在 0∼p−1 之间的逆元。
乘法逆元的定义
若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 a/b≡a×x(modm)a/b≡a×x(mod\ m)a/b≡a×x(mod m),则称 x 为 b 的模 m 乘法逆元,记为 b−1(modm)b^{−1}(mod\ m)b−1(mod m)。b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,bm−2b^{m−2}bm−2 即为 b 的乘法逆元。
第一行包含整数 n。
接下来 n 行,每行包含一个数组 ai,pia_i,p_iai,pi,数据保证 pip_ipi 是质数。
输出共 nnn 行,每组数据输出一个结果,每个结果占一行。
若 aia_iai 模 pip_ipi 的乘法逆元存在,则输出一个整数,表示逆元,否则输出 impossible。
- 1≤n≤1051≤n≤10^51≤n≤105
- 1≤ai,pi≤2×1091≤a_i,p_i≤2\times10^91≤ai,pi≤2×109
3
4 3
8 5
6 3
1
2
impossible
#include using namespace std;typedef long long LL;int n;LL qmi(int a, int k, int p) {LL res = 1;while(k) {if(k & 1) res = (LL)res * a % p;k >>= 1;a = (LL)a * a % p; }return res;
}int main() {cin >> n;while(n--) {int a, p;cin >> a >> p;if(a % p == 0) puts("impossible");else cout << qmi(a, p - 2, p) << endl;}return 0;
}