线性求逆元

发布时间 2023-09-30 15:37:06作者: value0

线性求逆元

时间复杂度:\(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;
}