线性求逆元
时间复杂度:\(O(n)\)
问题:求取\(1...n\)关于质数\(p\)的逆元。
应用举例:求取组合数\(C_n^m \ mod \ p\),其中\(1 \leq n,m\leq10^7,p = 998244353\)。
\[C_n^m \equiv \frac {n!} {(n-m)!m!} (mod \ p) \]\[C_n^m\equiv n! * (n-m)!^{-1}*m!^{-1} (mod\ p) \]假设我们求取\(n\)关于质数\(p\)的逆元,即求取\(n^{-1}\)。
我们设\(a = \lfloor\frac{p}{n}\rfloor,b = p\ mod\ n\)。那么就有
\[a*n + b \equiv 0(mod\ p)\tag{1} \]对公式\((1)\)移项可得:
\[\begin{align*} a*n &\equiv -b(mod\ p)\\ -\frac{a}{b} &\equiv n^{-1} (mod\ p) \end{align*} \]即:
\[\begin{align*} n^{-1} &\equiv -\frac{a}{b} (mod\ p)\\ &\equiv -\frac{\lfloor \frac{p}{n} \rfloor}{p\ mod\ n} (mod\ p)\\ &\equiv -\lfloor \frac{p}{n} \rfloor\cdot(p\ mod\ n)^{-1}(mod\ p)\\ &\equiv (p-\lfloor \frac{p}{n} \rfloor)\cdot(p\ mod\ n)^{-1}(mod\ p)\\ \end{align*} \]所以:
\[n^{-1} \equiv (p-\lfloor \frac{p}{n} \rfloor)\cdot(p\ mod\ n)^{-1}(mod\ p) \]无论\(p\)是多少,\(1\)的逆元就是\(1\).这是边界条件。
代码:
inv[1] = 1;
for(int i = 2;i<=n;i++)
{
inv[i] = (ll)(p - p/i)*(inv[p%i]) % p;
}
标签:lfloor,frac,rfloor,逆元,线性,mod,equiv
From: https://www.cnblogs.com/value0/p/17737873.html