题目连接: A Number Theoretical Problem
大致题意:
给出一个整数x 和 质数p, 让你找到一个整数y满足 (x * y) % p == 1.
如果找到则输出y % p的结果, 否则输出 -1;
解题思路:
与费马小定理和除法逆元有关
由除法逆元可知: (a / b) == a * bp-2 % p == 1
此时应该有: a * bp-2 == x * y; 而 b == a % p
所以得出y == xp-2 % p; 而我们只需要判断是否满足逆元条件即可.
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll mypow(ll a, ll b, ll mod) {
ll res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int main(void)
{
ll t; cin >> t;
ll x, p;
while (t--) {
cin >> x >> p;
if (x % p == 0) { printf("-1\n"); continue; }
printf("%lld\n", mypow(x, p - 2, p));
}
return 0;
}