当n为质数时,可以用快速幂求逆元:
a / b ≡ a * x (mod n)
两边同乘b可得 a ≡ a * b * x (mod n)
即 1 ≡ b * x (mod n)
同 b * x ≡ 1 (mod n)
由费马小定理可知,当n为质数时
b ^ (n - 1) ≡ 1 (mod n)
拆一个b出来可得 b * b ^ (n - 2) ≡ 1 (mod n)
故当n为质数时,b的乘法逆元 x = b ^ (n - 2)
当n不是质数时,可以用扩展欧几里得算法求逆元:
a有逆元的充要条件是a与p互质,所以gcd(a, p) = 1
假设a的逆元为x,那么有a * x ≡ 1 (mod p)
等价:ax + py = 1
exgcd(a, p, x, y)
题目
#include<iostream>
using namespace std;
typedef long long LL;
LL qs(int a,int b,int mod)
{
long long res=1;
while(b)
{
if(b&1) res=res*a%mod;
b>>=1;
a=(long long) a*a%mod;
}
return res;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b;
cin>>a>>b;
long long ans= qs(a,b-2,b);
if(a%b)
cout<<ans<<endl;
else
puts("impossible");
}
return 0;
}