数论综合

· · 算法·理论

排列组合

排列

A_n^m=\frac{n!}{(n-m)!}

n 个物品中拿取 m 个,考虑顺序的总排列数量。
其中 n,m\in \Z^+m \le n

组合

C_n^m=\frac{n!}{m! \cdot (n-m)!}

n 个物品中拿取 m 个,不考虑顺序的总组合数量。
其中 n,m\in \Z^+m \le n

也可以表示为 {n \choose m}

多重组合

n 物品中随意拿取 m 个,不考虑顺序的总组合数量。每类物品数量不限制。

可以表示为 \left( \! {n\choose m} \! \right)

\left( \! {n\choose m} \! \right) ={n+m-1 \choose n-1}={n+m-1 \choose m}

卡特兰数

卡特兰数

递推公式

C_0=1 C_n={2n \choose n}-{2n \choose n-1}=\frac{1}{n+1}{2n \choose n} C_n=\frac{C_{n-1} \cdot (4n-2)}{n+1}

公式 & 性质

{n \choose m}={n \choose n-m}

由组合数的意义推得。

{n \choose m}={n-1 \choose m}+{n-1 \choose m-1}

杨辉三角性质推得。

{n \choose m}=\frac{n}{m}\cdot {n-1 \choose m-1}

由公式推得。

{n \choose m}=\sum_{i=m-1}^{n-1}{i \choose m-1}

由杨辉三角性质推得。
组合意义:从一个长度为 n 的集合 \{1,2,\dots,n\} 中选取一个长度为 m 的子集,固定元素最大值为 i+1

\sum_{i=0}^n i{n \choose i}=n\cdot 2^{n-1}\pod {=\sum_{i=1}^n 2^{n-1}}

组合意义:一个长度为 n 的集合 \{1,2,\dots,n\} 其子集大小之和,等于包含某个特定元素的子集总数之和。

\sum_{i=0}^k{n \choose i}{m \choose k-i}={n+m \choose k}

组合意义:从两个互不相交的集合的并集中选取一个长度为 k 的子集的数量,等于从两个集合中分别选择 ik-i 个元素的组合总数。

{n \choose m}{m \choose k}={n \choose k}{n-k \choose m-k}

由公式推得。
组合意义:从一个长度为 n 的集合 S 中选取长度分别为 m,k 的两个子集 A,B,满足 B \subseteq A \subseteq S
等号左边先选择 A,再选择 B;等号后边先选择 B,再选择 A \oplus B

(x+y)^n=\sum_{i=0}^n{n \choose i}x^iy^{n-i}

二项式定理。

推论

{n \choose m}^2={n \choose m}{n \choose n-m}={2n \choose n}

由公式推得。

欧拉筛法

【模板】线性筛素数

一般情况下,单纯埃氏筛法可以在 300\text{ms} 内跑完 n=10^8,单纯欧拉筛法则需要 750\text{ms} 左右。
但是埃氏筛法在常数过大时甚至需要 2\text{s} 完成。
所以按需选用两种筛法很重要。

核心思想

让每个合数只被其最小质因数筛掉。

\Huge\sum

费马小定理

a^{p-1} \equiv 1 \pmod p

其中,a \in \Z\gcd(a,p) \neq 0p质数

欧几里得定理

朴素欧几里得

\gcd(a,b)=\gcd(b,a \bmod b)

证明:

不妨设 dab 的任意一个公因数,则由同余性质,a \equiv b \equiv 0 \pmod d
易得 ∀d | \gcd(a,b) 都满足这个性质。

假设 a=k \cdot b +r,有 r=a \bmod b
所以 a-k\cdot b \equiv r \equiv 0 \pmod d

代码:

int gcd(int a, int b){
    return !b ? a : gcd(b, a % b);
}

复杂度: O(\log)
(即使 a<b 算法也有效)

扩展欧几里得

贝祖等式

对于任意两个整数 ab,必定存在两个整数 xy,满足以下等式:

ax+by=\gcd(a,b)

使用扩展欧几里得算法能够计算出 xy一组值,从而求出其所有值的表达式。

x = x_0+i\cdot \frac{b}{\gcd(a,b)}\\ y = y_0-i\cdot \frac{a}{\gcd(a,b)} \end{cases}

其中,i \in \Z

推理过程:

由贝祖等式,

ax+by=\gcd(a,b)

即,

ax+by&=\gcd(b,a \bmod b)\\ &=bx+(a \bmod b)y\\ &=bx+(a-\lfloor\frac{a}{b}\rfloor b)y\\ &=ay+b(x-\lfloor\frac{a}{b}\rfloor y) \end{aligned}

观察到此时 x 变成了 yy 变成了 (x-\lfloor\frac{a}{b}\rfloor y)
利用这个性质,我们就可以递归求解 xy

时间复杂度同样是 O(\log)

代码如下:

void exgcd(int a, int b, int &x, int &y){
    if(!b) x = 1, y = 0;
    else exgcd(b, a % b, y, x), y -= a / b * x;
}

代码在回溯时更新 y 的值。

建议修改成返回结构体。

注意此时 x 可能为负数或 \ge m,所以应当把 x 赋值为 [(x \bmod m + m)\bmod m]

乘法逆元

定义:对于一个非零元素 a,若存在元素 b,使得 a \cdot b=1,则称 ba 的乘法逆元,记作 a^{-1}

这里主要讨论模意义下的乘法逆元,即使关于 a \cdot b \equiv 1 \pmod m 成立的 b 的值。
注意 am 一定互素

扩展欧几里得

由同余性质:

a \cdot x \equiv 1 \pmod m \iff ax+my \equiv 1 \pmod m

所以求逆元的过程就转变为了求不定方程 ax+my=ca \perp mam 互素)且 c=1x 的解
这样就能用扩展欧几里得计算出 a 乘法逆元 x 的值。

注意此处是 \gcd(a,m),非 \gcd(a,b)

费马小定理

a^{p-1} \equiv 1 \pmod p \iff a^{p-2} \equiv a^{-1} \pmod p

费马小定理推得,可直接求出逆元值

线性逆元

用于求一串数字对于 \bmod \, m 的逆元。

初始化:1^{-1} \equiv 1 \pmod m

i^{-1} \equiv 1 \pmod mk=\lfloor\frac{m}{i}\rfloorr=m \bmod i,则:

m=k \cdot i+r

即:

k \cdot i+r \equiv 0 \pmod m

同乘 i^{-1} \cdot r^{-1},得:

k \cdot r^{-1} + i^{-1} \equiv 0 \pmod m i^{-1} \equiv -k \cdot r^{-1} \pmod m i^{-1} \equiv -\lfloor\frac{m}{i}\rfloor \cdot (m \bmod i)^{-1} \pmod m i^{-1} \equiv (m-\lfloor\frac{m}{i}\rfloor) \cdot (m \bmod i)^{-1} \pmod m

代码:

inv[1] = 1;
for(int i = 2; i < m; ++ i){
    inv[i] = (m - m / i) * inv[m % i] % m;
}

阶乘逆元

核心在于逆推
这个方法易于理解,而且也能达到和线性逆元类似的效果。

s_ii! 的乘法逆元,则存在以下递推关系:

s_n=\frac{1}{n!} s_i=\frac{1}{i!}=s_{i+1}\cdot (i+1)

其中 i! 可以递推,s_n 可以用扩展欧几里得或费马小定理求。

即:

i^{-1} \equiv s_i \cdot (i-1)! \pmod m

预处理复杂度为 O(n),查询复杂度为 O(1)

欧拉函数

欧拉定理

$$ \begin{cases} \varphi(m) &= m\prod_{p|m}\left(1-\frac{1}{p}\right)\\ \varphi(p) &= p-1\\ \varphi(p^k) &= p^k(1-\frac{1}{p}) \end{cases} $$ 三种求法: 1. 利用积性求解。 * 当 $a$ 与 $b$ 互素时,$\varphi(ab)=\varphi(a)\cdot\varphi(b)$。 * 推论:$\varphi(p^k\cdot q^l)=p^k(1-\frac{1}{p})\cdot q^l(1-\frac{1}{q})
  1. 利用容斥。
  2. 利用反演。

应用

费马小定理证明

考虑 \{1,2,3,\dots,p-1\}\{a,2a,3a,\dots,(p-1)a\} 的关系。