(1)p为质数:用快速幂和费马小定理即可求出
ll qpow(ll a,ll b,ll p){
ll res = 1;
while (b){
if(b & 1) res = res * a % p;
b >>= 1;
a = a*a % p;
}
return res;
}
ll inv(ll a,ll b){ //a mod b 的逆元
return qpow(a,b-2,b);
}
(2)p不是质数:我们用拓展欧几里得定理求
/**
*假设a的逆元为x,那么有a * x ≡ 1 (mod p)
*等价:ax + py = 1
*exgcd(a, p, x, y)
*/
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) {
x = 1, y = 0;
return a;
}
ll d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}