各种逆元推导
逆元
求解一(費(fèi)馬小定理)
ppp是一個(gè)質(zhì)數(shù),并且a%p=?0a \% p \not= 0a%p?=0,則有ap?1≡1(modp)a ^ {p - 1} \equiv 1 \pmod pap?1≡1(modp),ap?2≡a?1a ^ {p - 2} \equiv a ^ {-1}ap?2≡a?1,即可得到逆元。
int quic_pow(int a, int n, int mod) {int ans = 1;while(n) {if(n & 1) ans = (ans * a) % mod;a = (a * a) % mod;n >>= 1;}return ans; } int inv(int a, int p) {return quick_pow(a, p - 2, p); }求解二(拓展歐幾里德)
我們知道拓展歐幾里德算法可以求解ax+by=gcd(a,b)ax + by = gcd(a, b)ax+by=gcd(a,b),對(duì)逆元考慮假設(shè)有a?x+b?y=1a * x + b * y = 1a?x+b?y=1那么顯然有a?x≡1(modb)a * x \equiv 1 \pmod ba?x≡1(modb),這不就出來(lái)了嗎,xxx就是aaa模bbb下的逆元,當(dāng)然了這里也要有a,ba, ba,b互質(zhì)。
int exgcd(int a, int b, int & x, int & y) {if(!b) {x = 1, y = 0;return a;}int gcd = exgcd(b, a % b, x, y);int temp = x;x = y;y = temp - a / b * y;return gcd; } int main() {int a, mod, inv, t;exgcd(a, mod, inv, t);return 0; }求解三(線性求解逆元)
我們假定有mod=k?a+b,k=moda,b=mod%a,b<amod = k * a + b, k = \frac{mod} {a}, b = mod \% a,b < amod=k?a+b,k=amod?,b=mod%a,b<a
k?a+b≡0(modmod)k * a + b \equiv 0 \pmod {mod}k?a+b≡0(modmod)
同時(shí)乘以a?1b?1a ^ {-1}b^{-1}a?1b?1
得k?b?1+a?1≡0(modmod)k * b ^{-1} + a ^{-1} \equiv 0 \pmod {mod}k?b?1+a?1≡0(modmod)
a?1≡?k?b?1(modmod)a ^{-1} \equiv -k * b ^ {-1} \pmod {mod}a?1≡?k?b?1(modmod)
a?1≡mod?b?1?k?b?1(modmod)a ^ {-1} \equiv mod * b ^{-1} - k * b^ {-1} \pmod {mod}a?1≡mod?b?1?k?b?1(modmod)
所以我們就推導(dǎo)完了。
int inv[n], mod = 100007, n = mod; inv[1] = 1; for(int i = 2; i < n; i++) {inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod; }求解四(CnmC _{n} ^ {m}Cnm?中的逆元求解)
a!?1=na! ^ {-1} = na!?1=n那么我們不難發(fā)現(xiàn)(a?1)!?1=a!?1?a(a - 1) ! ^ {-1} = a! ^{-1} * a(a?1)!?1=a!?1?a
void init() {fac[0] = 1;for(int i = 1; i < N; i++)fac[i] = (fac[i - 1] * i) % mod;inv[N - 1] = qpow(fac[N - 1], mod - 2);for(int i = N - 2; i >= 0; i--)inv[i] = (inv[i + 1] * (i + 1)) % mod; }總結(jié)
- 上一篇: 融资租赁业务系统(财务中台)
- 下一篇: 乔布斯时代结束