S 知识点总结(?)

威尔逊定理

定理

(p1)!1(modp)(p-1)! \equiv -1 \pmod p

证明

集合的差:AB={xxAx∉B}A \setminus B = \{x |x \isin A \land x \not \isin B \}

x\overline{x} 表示模 ppxx 的数组成的集合。

p=2p=2 时,命题显然成立。

以下设 p3p\geq 3,此时我们要证 Zp\mathbf{Z}_p 中所有非零元素的积为 1\overline{-1}

我们知道 Zp\mathbf{Z}_p 中所有非零元素 aa 都有逆元 a1a^{-1},于是 Zp\mathbf{Z}_p 中彼此互逆的元素乘积为 1\overline{1}

但是要注意 aaa1a^{-1} 可能相等。若 a=a1a=a^{-1},则 a21(modp)a^2\equiv 1\pmod p,即

0a21(a+1)(a1)(modp)0\equiv a^2-1\equiv (a+1)(a-1)\pmod p

从而 a1(modp)a\equiv 1\pmod pa1(modp)a\equiv -1\pmod p

这说明 Zp{0,1,1}\mathbf{Z}_p \setminus \{\overline{0},\overline{1},\overline{-1}\} 中所有元素的乘积为 1\overline{1}, 进而 Zp\mathbf{Z}_p 中所有非零元素的积为 1\overline{-1}

应用

阶乘与素数

在某些情况下,有必要考虑以某个素数 pp 为模的公式,包含分子和分母中的阶乘,就像在二项式系数公式中遇到的那样。

只有当阶乘同时出现在分数的分子和分母中时,这个问题才有意义。否则,后续项 p!p! 将减少为零。但在分数中,因子 pp 可以抵消,结果将是非零。

因此,要计算 n!modpn! \bmod p,而不考虑阶乘中出现因数 pp。写下素因子分解,去掉所有因子 pp,并计算乘积模。

(n!)p(n!)_p 表示这个修改的因子。例如:

(7!)p1213452672mod3(7!)_p \equiv 1 \cdot 2 \cdot \underbrace{1}_{3} \cdot 4 \cdot 5 \underbrace{2}_{6} \cdot 7 \equiv 2 \bmod 3

这种修正的阶乘,可用于快速计算各种带取模和组合数的公式的值(吗?)。

计算余数的算法

计算上述去掉因子 pp 的阶乘模 pp 的余数。

(n!)p=123(p2)(p1)1p(p+1)(p+2)(2p1)22p (2p+1)(p21)1p2(p2+1)n(modp)=123(p2)(p1)1p12(p1)22p12 (p1)1p212(nmodp)(modp)\begin{aligned} (n!)_p &= 1 \cdot 2 \cdot 3 \cdot \ldots \cdot (p-2) \cdot (p-1) \cdot \underbrace{1}_{p} \cdot (p+1) \cdot (p+2) \cdot \ldots \cdot (2p-1) \cdot \underbrace{2}_{2p} \\\ &\quad \cdot (2p+1) \cdot \ldots \cdot (p^2-1) \cdot \underbrace{1}_{p^2} \cdot (p^2 +1) \cdot \ldots \cdot n \pmod{p} \\\\ &= 1 \cdot 2 \cdot 3 \cdot \ldots \cdot (p-2) \cdot (p-1) \cdot \underbrace{1}_{p} \cdot 1 \cdot 2 \cdot \ldots \cdot (p-1) \cdot \underbrace{2}_{2p} \cdot 1 \cdot 2 \\\ &\quad \cdot \ldots \cdot (p-1) \cdot \underbrace{1}_{p^2} \cdot 1 \cdot 2 \cdot \ldots \cdot (n \bmod p) \pmod{p} \end{aligned}

可以清楚地看到,除了最后一个块外,阶乘被划分为几个长度相同的块。

(n!)p=123(p2)(p1)11st123(p2)(p1)22nd123(p2)(p1)1pth12(nmodp)tail(modp).\begin{aligned} (n!)_p&= \underbrace{1 \cdot 2 \cdot 3 \cdot \ldots \cdot (p-2) \cdot (p-1) \cdot 1}_{1\text{st}} \cdot \underbrace{1 \cdot 2 \cdot 3 \cdot \ldots \cdot (p-2) \cdot (p-1) \cdot 2}_{2\text{nd}} \cdot \ldots \\\\ & \cdot \underbrace{1 \cdot 2 \cdot 3 \cdot \ldots \cdot (p-2) \cdot (p-1) \cdot 1}_{p\text{th}} \cdot \ldots \cdot \quad \underbrace{1 \cdot 2 \cdot \cdot \ldots \cdot (n \bmod p)}_{\text{tail}} \pmod{p}. \end{aligned}

块的主要部分 (p1)! mod p(p-1)!\ \mathrm{mod}\ p 很容易计算,可以应用 Wilson 定理:

(p1)!1(modp)(p-1)!\equiv -1\pmod p

总共有 np\lfloor \frac{n}{p} \rfloor 个块,因此需要将 np\lfloor \frac{n}{p} \rfloor 写到 1-1 的指数上。可以注意到结果在 1-111 之间切换,因此只需要查看指数的奇偶性,如果是奇数,则乘以 1-1。除了使用乘法,也可以从结果中减去 pp

最后一个部分块的值可以在 O(p)O(p) 的时间复杂度单独计算。

这只留下每个块的最后一个元素。如果隐藏已处理的元素,可以看到以下模式:

(n!)p=12(p1)112(n!)_p = \underbrace{ \ldots \cdot 1 } \cdot \underbrace{ \ldots \cdot 2} \cdot \ldots \cdot \underbrace{ \ldots \cdot (p-1)} \cdot \underbrace{ \ldots \cdot 1 } \cdot \underbrace{ \ldots \cdot 1} \cdot \underbrace{ \ldots \cdot 2} \cdots

这也是一个修正的阶乘,只是维数小得多。它是:

(np!)p\left(\left\lfloor \frac{n}{p} \right\rfloor !\right)_p

因此,在计算修改的阶乘 (n!)p(n!)_p 中,执行了 O(p)O(p) 个操作,剩下的是计算 (np!)p(\lfloor \frac{n}{p} \rfloor !)_p,于是有了递归,递归深度为 O(logpn)O(\log_p n),因此算法的总时间复杂度为 O(plogpn)O(p \log_p n).

如果预先计算阶乘 0!,1!,2!,,(p1)!0!, 1!, 2!, \dots, (p-1)!pp,那么时间复杂度为 O(logpn)O(\log_p n).

错排列

问题

aa11nn 的一个全排列,求满足 i[1,n],aii\forall i \isin [1,n] ,a_i \not = i 的排列数量。

解法

正难则反,求 i[1,n],ai=i\exists i \isin [1,n] ,a_i = i 的排列数。

于是令一个排列的相等的地方为 pp,大小为 kki[1,k],api=pi\forall i \isin [1,k],a_{p_i}=p_{i}),显然,它对答案的贡献为 (nk)!(n-k)!,观察到 pp 中具体有哪些元素我们并不关心,我们只关心它有多少元素,可以得出答案为:

i=0n(1)iCni(ni)!=i=0n(1)in!i!\sum_{i=0}^{n}(-1)^i\operatorname{C}^i_n(n-i)!=\sum_{i=0}^{n}(-1)^i\frac{n!}{i!}

圆排列

问题

nn 个不同元素中取出 mm 个元素,不分首尾的围成一个圆的排列叫做圆排列,求其方案个数。

解法

笛卡尔树(没听到讲)

多重集的排列组合

严格次小生成树

树套树


S 知识点总结(?)
https://www.lzj-blog.top/2024/11/19/S 知识点总结(?)/
作者
lzj
发布于
2024年11月19日
许可协议