我已经没什么好开场的了 😂
那就开幕雷击吧:你所需要的一切数学 (不要再来找我了)
$$ |A| = \sum_{a \in A} 1 $$
(这有用吗 😂😂😂)
计数的本质是
集合 的生成 (枚举)。
$$ |A| = \sum_{a \in A} 1 $$
扩展到两个集合
因为通用
Inductive nat : Type :=
| O
| S (n : nat).
Fixpoint plus (n : nat) (m : nat) : nat :=
match n with
| O ⇒ m
| S n' ⇒ S (plus n' m)
end.
$n$-bit 二进制串一共有多少个?
$n$-bit 二进制串中 “0” 比 “1” 多的一共有多少个?
“加法原理”
$$ {n \choose n} + {n \choose n-1} + \ldots + {n \choose \lfloor n/2 \rfloor + 1} $$
如果把 0 看作 “(”、1 看作 “)”,配对的括号序列有多少个?
(()) - 0011
; )()()(
- 101010
求 $1, 2, \ldots, n$ 所有排列的数量
错位排列:求所有 $1, 2, \ldots n$ 的排列中,每个数字都不在原位的排列数量
还记得 “集合” 吗?
from itertools import permutations
n = 4
for p in permutations(list(range(n)), n):
if True not in [p[i] == i for i in range(n)]:
print([x+1 for x in p])
加法原理
$$ |A \cup B| = |A| + |B| $$
成立条件:$A\cap B=\varnothing$
“互相存在关联” 的 $|A \cup B|$ 能不能求解?
$|A \cup B| = |A| + |B| - |A \cap B|$
这样很多麻烦的计数问题就可以求解了!
$$ (x_0\ x_1\ x_2\ x_3\ x_4\ x_5\ x_6\ x_7) \cdot \left( \begin{array}{c} |\varnothing|=0 \\ |A| \\ |B| \\ |C| \\ |A \cap B| \\ |A \cap C| \\ |B \cap C| \\ |A \cap B \cap C| \\ \end{array} \right) = |A\cup B\cup C| $$
考虑 “单个元素” 的集合 ${e}$
$$ (x_1\ x_2\ x_3\ x_4\ x_5\ x_6\ x_7) \cdot \left( \begin{array}{c} |A| \\ |B| \\ |C| \\ |A \cap B| \\ |A \cap C| \\ |B \cap C| \\ |A \cap B \cap C| \\ \end{array} \right) = |A\cup B\cup C| $$
解方程组的程序:pie.py
subsets = [
{ i for i in range(n) if (x >> i) & 1 }
for x in range(1, 2**n) ]
solver = z3.Solver()
X = [z3.Int(f'x{i+1}') for i, _ in enumerate(subsets)]
for i, s in enumerate(subsets):
cons = z3.Sum([X[j] for j, s1 in enumerate(subsets) \
if s1.issubset(s)]) == 1
solver.add(cons)
用若干个集合 “覆盖” 一个不规则的集合,即可化并为交!
容 (inclusion)
斥 (exclusion)
错位排列:求所有 $1, 2, \ldots $n 排列中,每个数字都不在原位的排列数量
例子:$n=4$
“集合” 和 “并” 是非常具有一般性的结构
$$ \phi(n) = \sum_{d \mid n} \mu(d) \cdot \frac{n}{d} $$
$$g(A) = \sum_{S \subseteq A} f(S) \Rightarrow f(A) = \sum_{S \subseteq A} \mu(A-S) g(S)$$
容斥原理:偏序集上 Mobius 反演在 Boolean Lattice 上的应用 (Gian-Carlo Rota, 1964)
给定正整数 $m \le 10^{18}$,统计非空集合 $S$ 的数量,其中 $S$ 满足 $$\gcd(S) = 1 \land \textrm{lcm}(S) = m$$
枚举 (计数) 的是
$$ |A| = \sum_{a \in A} 1 $$
简化问题的钥匙: