扩展欧几里得法求逆元
void exgcd(int a, int b, int& x, int& y)
{
if (b == 0) {
x = 1;
y = 0;
return;
}
exgcd(b, a % b, y, x);
y -= a / b * x;
}
快速幂法求逆元
因为 ax≡1(modb) ;
所以 ax≡ab−1(modb) (根据 费马小定理 );
所以 x≡ab−2(modb) 。
线性求逆元
求出 1,2,...,n 中每个数关于 p 的逆元。
首先,很显然的 1−1≡1(modp) ;
然后,设 p=ki+j,j<i,1<i<p ,再放到 modp 意义下就会得到: ki+j≡0(modp) ;
两边同时乘 i−1,j−1 :
kj−1+i−1≡0(modp) ;
i−1≡−kj−1(modp) ;
i−1≡−(ip)(pmodi)−1 ;
inv[i] = 1;
for (int i = 2; i <= n; i++) {
inv[i] = (ll)(p - p / i) * inv[p % i] % p;
}