小费马定理求逆元(复杂度O(logn))
ll FastPower(ll n, ll k) {
ll ans = 1;
k %= mod;
while(n) {
if(n % 2) { // n & 1
ans = (ans * k) % mod;
}
n >>= 1;
k = (k * k) % mod;
}
return ans;
}
ll Inverse(ll n) {
return FastPower(n, mod - 2);
}
扩展欧几里德求逆元(复杂度O(logn))
ll extend_gcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
else {
ll r = extend_gcd(b, a % b, y, x);
y -= x * (a / b);
return r;
}
}
ll Inverse(ll a, ll n) {
ll x, y;
extend_gcd(a, n, x, y);
x = (x % n + n) % n;
return x;
}
逆元线性筛(复杂度O(n))
const int mod = 1000000009;
const int maxn = 10005;
int inv[maxn];
inv[1] = 1;
for(int i = 2; i < 10000; i++)
inv[i] = inv[mod % i] * (mod - mod / i) % mod;
阶乘求逆元
inv[maxn]=mod_pow(fac[maxn],mod-2);
for(ll i=maxn-1;i>=0;i--)
inv[i]=(inv[i+1]*(i+1))%mod;