???+note "代码实现"
```cpp
inv[1] = 1;
- for (int i = 2; i <= n; ++i)
- inv[i] = (long long)(p - p / i) * inv[p % i] % p;
+ for (int i = 2; i <= n; ++i) inv[i] = (long long)(p - p / i) * inv[p % i] % p;
```
使用 $p-\lfloor \dfrac{p}{i} \rfloor$ 来防止出现负数。
-另外我们注意到我们没有对 `inv[0]` 进行定义却可能会使用它:当 $i | p$ 成立时,我们在代码中会访问 `inv[p % i]`,也就是 `inv[0]`,这是因为当 $i | p$ 时不存在 $i$ 的逆元 $i^{-1}$。[线性同余方程](./linear-equation.md) 中指出,如果 $i$ 与 $p$ 不互素时不存在相应的逆元(当一般而言我们会使用一个大素数,比如 $10^9 + 7$ 来确保它有着有效的逆元)。因此需要指出的是:如果没有相应的逆元的时候,`inv[i]` 的值是未定义的。
+另外我们注意到我们没有对 `inv[0]` 进行定义却可能会使用它:当 $i | p$ 成立时,我们在代码中会访问 `inv[p % i]` ,也就是 `inv[0]` ,这是因为当 $i | p$ 时不存在 $i$ 的逆元 $i^{-1}$ 。 [线性同余方程](./linear-equation.md) 中指出,如果 $i$ 与 $p$ 不互素时不存在相应的逆元(当一般而言我们会使用一个大素数,比如 $10^9 + 7$ 来确保它有着有效的逆元)。因此需要指出的是:如果没有相应的逆元的时候, `inv[i]` 的值是未定义的。
另外,根据线性求逆元方法的式子: $i^{-1} \equiv -kj^{-1} \pmod p$
[「AHOI2005」洗牌](https://www.luogu.com.cn/problem/P2054)
[「SDOI2016」排列计数](https://loj.ac/problem/2034)
+
+$$
+
$$