longlongexgcd(longlong a, longlong b, longlong &x, longlong &y)// 拓欧 { if (b == 0) { x = 1; y = 0; return a; } longlong d = exgcd(b, a % b, y, x); y -= (a / b) * x; return d; } longlonginv(longlong a, longlong p) { longlong x, y; if (exgcd(a, p, x, y) != 1) // 无解的情形 return-1; return (x % p + p) % p; }
费马小定理
若是质数,且,则有,于是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
longlongqpow(longlong a, longlong n, longlong p)// 快速幂 { longlong ans = 1; while (n) { if (n & 1) ans = ans % p * a % p; a = a % p * a % p; n >>= 1; } return ans; } longlonginv(longlong a, longlong p) { returnqpow(a, p - 2, p); }
线性递推
1 2 3 4 5 6 7 8 9 10 11 12
longlong Inv[MAXN] = {0, 1}; inlinelonglongmod(longlong a, longlong p) { return (a % p + p) % p; } longlonginv(longlong a, longlong p) { if (Inv[a]) return Inv[a]; Inv[a] = mod(-p / a * inv(p % a, p), p); return Inv[a]; }