AcWing.876.快速幂求逆元

给定 n n n 组 ai,pi,其中 pi 是质数,求 ai 模 pi 的乘法逆元,若逆元不存在则输出 i m p o s s i b l e impossible impossible

注意:请返回在 0 ∼ p − 1 0∼p−1 0p1 之间的逆元。

乘法逆元的定义若整数 b , m b,m bm 互质,并且对于任意的整数 a a a,如果满足 b ∣ a b|a ba,则存在一个整数 x x x,使得 a b ≡ a ∗ x ( m o d m ) \frac{a} {b} ≡ a*x(mod m) baax(modm),则称 x x x b b b 的模 m m m 乘法逆元,记为 b−1(mod m)。

b b b 存在乘法逆元的充要条件是 b b b 与模数 m m m 互质。当模数 m m m为质数时,bm−2 即为 b b b 的乘法逆元。

输入格式
第一行包含整数 n n n

接下来 n n n 行,每行包含一个数组 ai,pi,数据保证 pi 是质数。

输出格式
输出共 n n n 行,每组数据输出一个结果,每个结果占一行。

若 ai 模 pi 的乘法逆元存在,则输出一个整数,表示逆元,否则输出 i m p o s s i b l e impossible impossible

数据范围
1 ≤ n ≤ 105 , 1 ≤ a i , p i ≤ 2 ∗ 10 1≤n≤105,1≤ai,pi≤2∗10 1n105,1ai,pi210 9

输入样例:

4 3
8 5
6 3

输出样例:

2
impossible

即求一个数x,使得 b ∗ x ≡ 1 ( m o d p ) b * x ≡ 1 (mod p) bx1modp又由费马定理,得 b b b p-1 ≡ 1 ( m o d m ) ≡ 1 (mod m) 1(modm),那么 b ∗ b b * b bb p-2 ≡ 1 ( m o d m ) ≡1 (mod m) 1(modm),可得逆元就为 b b b p-2 m o d m mod m modm

b b b p p p的倍数的时候,即 b b b p p p不互质的时候,最后 m o d mod mod后会得到 0 0 0,一定无解

代码:

#include
using namespace std;
#define ll long long

int qmi(int a, int k, int p) {
	int res = 1;
	while (k) {
		if(k & 1) res = (ll)res * a % p;
		k >>= 1;
		a = (ll)a * a % p;
	}
	return res;
}

int main() {
	int n; cin >> n;
	while (n--) {
		int a, p; cin >> a >> p;
		int ans = qmi(a, p - 2, p);
		if (a % p)printf("%d\n", ans);
		else printf("impossible\n");
	}
	return 0;
}

你可能感兴趣的:(算法,c++)