组合恒等式:
[inom{n}{m} = inom{n}{n-m} ag{1}
]
[inom{n}{m} inom{m}{k} = inom{n}{k} inom{n-k}{m-k} ag{2}
]
[sum_{i=0}^n inom{r}{i} inom{s}{n-i} = inom{r+s}{n} ag{范德蒙德卷积恒等式}
]
[sum_{i=0}^n inom{i}{m} = inom{n+1}{m+1} ag{上指标求和一}
]
[sum_{i=0}^m inom{n+i}{n} = inom{n+m+1}{m} ag{上指标求和二}
]
[sum_{k=0}^m inom{n+k}{k} = inom{n+m+1}{m} ag{斜求和}
]
[sum_{i=0}^n left(egin{matrix} n \ i end{matrix}
ight) = 2^n ag{整行求和}
]
[sum_{i=0}^n inom{n}{i}[2mid i] = sum_{i=0}^n inom{n}{i}[2
mid i] = 2^{n-1} ag{间隔求和, 要求 $n > 0$}
]
[sum_{i=0}^n inom{n}{i} (-1)^i = sum_{i=0}^n inom{n}{i} (-1)^{i+1} = [n=0] ag{间隔共轭求和, 是二项式反演的基础}
]
选几个组合意义不明显又不容易归纳的证明一下:
对上指标求和一的证明:
从 ([1,n+1]) 中选 (m+1) 个数, 将方案按照最大的数分类, 即可得到此式子。
对上指标求和二的证明:
[sum_{i=0}^m left(egin{matrix} n+i \ n end{matrix}
ight)
]
[sum_{i=0}^{n+m} left(egin{matrix} i \ n end{matrix}
ight) - sum_{i=0}^{n-1} left(egin{matrix} i \ n end{matrix}
ight)
]
[=left(egin{matrix} n+m+1 \ n+1 end{matrix}
ight) - left(egin{matrix} n \ n+1 end{matrix}
ight)
]
[=left(egin{matrix} n+m+1 \ m end{matrix}
ight)
]
这东西好像还有个因吹斯挺的组合意义, 但我困了, 今天上午再说(2020.8.6 0:12)
T1
手玩下可以发现, 最终局面之与各 (a_i) 的数量有关, 与它们的排列顺序无关。
那么, 如果存在一个 (i) 使得 (ge i) 的 (a_k) 的总数超过 (n-i+1), 就不合法。
通过 (DP) 统计方案。
设 (f[i][j]) 表示 (ge i) 的编号总共又放了 (j) 人, 答案就是 (f[1][n-m])。
转移方程如下:
[f[i][j] = sum limits_{k = 0}^j f[i + 1][j - k] imes C_j^k Big(0 le j le n - i + 1 - (不归你安排的 ge i 的个数) Big)
]
T2
第一步处理是容斥。
[ans = sum_{i=0}^n sum_{j=0}^n [i+j>0] (-1)^{i+j-1} C_n^iC_n^j f(i,j)
]
其中, (f(i,j)) 表示至少有 (i) 行 (j) 列 同色的方案数。
1.当 (i>0) 且 (j>0) 时, 这几行几列都是同色的, 此时方案数为 (3 * 3^{(n-i)*(n-j)})。
2.若 (i=0) 异或 (j=0), 方案数为 (3^{i+j} * 3^{n*(n-i-j)})。((i+j) 就是 (i) 异或 (j))
后者计算方便且适于时限, 现在处理前者。
[pre = sum_{i=1}^n sum_{j=1}^n (-1)^{i+j-1} C_n^i C_n^j 3*3^{(n-i)*(n-j)}
]
令 (p = n-i), (q = n-j)
[pre = 3sum_{p=0}^{n-1} sum_{q=0}^{n-1} (-1)^{2n-p-q-1} C_n^p C_n^q 3^{pq}
]
由于 (2n) 是偶数, 所以 (2n-p-q-1) 和 (2n - (2n-p-q-1)) 奇偶性相同, 故:
[pre = 3sum_{i=0}^{n-1} sum_{j=0}^{n-1} (-1)^{i+j+1} C_n^i C_n^j 3^{ij}
]
[= 3sum_{i=0}^{n-1} C_n^i (-1)^{i+1} sum_{j=0}^{n-1} C_n^j (-3^i)^j
]
[= 3sum_{i=0}^{n-1} C_n^i (-1)^{i+1} [(1-3^i)^n - (-3^i)^n]
]
这题就做完啦。
T3
T4
T5
经典问题:自然数幂之和
(S_k(n) = sum_{i=1}^n i^k)。
命题:(S_k(n)) 是关于 (n) 的 (k+1) 次多项式。
证明:对 (k) 归纳。
- (k = 0), (S_0(n) = n),是关于 (n) 的 (1) 次多项式。
- 考虑一个十分奇妙的构造:
[sum_{i=1}^n [(i+1)^{d+1} - i^{d+1}] = sum_{i=1}^n sum_{j=0}^d left(egin{matrix}d+1\jend{matrix}
ight) i^j
]
[(n+1)^{d+1} - 1 = sum_{j=0}^d left(egin{matrix}d+1\jend{matrix}
ight) sum_{i=1}^ni^j = sum_{j=0}^d left(egin{matrix}d+1\jend{matrix}
ight) S_j(n)
]
[left(egin{matrix}d+1\dend{matrix}
ight)S_d(n) = (n+1)^{d+1} - sum_{j=0}^{d-1} left(egin{matrix}d+1\jend{matrix}
ight) S_j(n) - 1
]
最后这个式子就明显表明了:如果对于 (forall kle d-1), (S_k(n)) 是关于 (n) 的 (k+1) 多项式, 那么 (S_d(n)) 就是关于 (n) 的 (d+1) 次多项式。
对了, 依照上面的式子, 似乎得到了一个递推式:
[S_d(n) = frac{1}{d+1} Big[ (n+1)^{d+1} - sum_{j=0}^{d-1} left(egin{matrix}d+1\jend{matrix}
ight) S_j(n) - 1 Big]
]
拉格朗日插值
众所周知, (k+1) 个点值 ((x_{iin[0,k]},y_i)) 唯一决定一个 (k) 次多项式(这里多项式都是实系数的)。
根据拉格朗日插值, 这个多项式是:
[F(x) = sum_{i=0}^k y_i prod_{i
eq j} frac{x-x_j}{x_i-x_j}
]
证明:
只要对于 (forall i in [0,k]), (F(x_i) = y_i), 那么 (F(x)) 就是那个唯一的多项式。
依据这个思路, 将 (x_p) 代入 (F(x)) :
[F(x_p) = sum_{i=0}^k y_i prod_{i
eq j} frac{x_p-x_j}{x_i-x_j}
]
[= sum_{i=0}^k y_i prod_{i
eq j} frac{x_p-x_j}{x_i-x_j} [i=p] + sum_{i=0}^k y_i prod_{i
eq j} frac{x_p-x_j}{x_i-x_j} [i
eq p]
]
[= y_p prod_{p
eq j} frac{x_p-x_j}{x_p-x_j} + sum_{i=0}^k y_i prod_{i
eq j} frac{x_p-x_j}{x_i-x_j} [i
eq p]
]
[= y_p + 0
]
所以拉格朗日插值公式是正确的。
用拉插解 (S_k(n))
由于 (S_k(n)) 为 (k+1) 次多项式, 所以只要求出 (k+2) 个点值, 就可以拉插了。
选 (x in [0,k+1]) 这 (k+2) 个点值:
不赘述了, 很好设计算法, 有对模数的要求。
[egin{Bmatrix} n \ m end{Bmatrix}
]
[inom{n}{m}
]
[egin{bmatrix} n \ m end{bmatrix}
]
斯特林数与阶幂
第一类斯特林数 (egin{bmatrix} n \ m end{bmatrix}) 表示有 (m) 个循环的 (n) 阶置换的数量。
递推式为 (egin{bmatrix} n \ m end{bmatrix} = egin{bmatrix} n-1 \ m-1 end{bmatrix} + (n-1)egin{bmatrix} n-1 \ m end{bmatrix})
第二类斯特林数 (egin{Bmatrix} n \ m end{Bmatrix}) 表示将 (n) 阶集合划分成 (m) 个集合的方案数。
递推式为 (egin{Bmatrix} n \ m end{Bmatrix} = egin{Bmatrix} n-1 \ m-1 end{Bmatrix} + megin{Bmatrix} n-1 \ m end{Bmatrix})
它们的边界条件都是 (egin{bmatrix} 0 \ 0 end{bmatrix} = egin{Bmatrix} 0 \ 0 end{Bmatrix} = 1)。
下降幂 (n^{underline m} = n(n-1)(n-2)cdots (n-m+1))
上升幂 (n^{overline m} = n(n+1)(n+2)cdots (n+m-1))
定理1
[n^m = sum_{i=0}^m egin{Bmatrix} m \ i end{Bmatrix} n^{underline i} ag{普通幂转下降幂}
]
证明:
通过组合意义考虑, (n^m) 表示将 (m) 个不同的球放到 (n) 个盒子里的方案数, 通过将这些方案按照 “有几个盒子非空” 分类, 得到:
[n^m = sum_{i=0}^m inom{n}{i} egin{Bmatrix} m \ i end{Bmatrix} i! = sum_{i=0}^m egin{Bmatrix} m \ i end{Bmatrix} n^{underline i}
]
定理2
[n^{overline m} = sum_{i=0}^m egin{bmatrix} m \ i end{bmatrix} n^i ag{上升幂转普通幂}
]
证明:
用归纳法证明比较优美。(合并的快感)
- (m=1) 时, 显然成立。
[n^{overline m} = (n+m-1) n^{overline{m-1}} = (n+m-1) sum_{i=0}^{m-1} egin{bmatrix} m-1 \ i end{bmatrix} n^i
]
[= sum_{i=1}^{m} egin{bmatrix} m-1 \ i-1 end{bmatrix} n^i + (m-1)sum_{i=0}^{m-1} egin{bmatrix} m-1 \ i end{bmatrix} n^i
]
再由于 (egin{bmatrix} n \ -1 end{bmatrix} = egin{bmatrix} n \ n+1 end{bmatrix} = 0) 之类的性质, 定理2 就得证了。
斯特林反演
啊这 ( ext{vfleaking}) 的炫酷反演魔术确实是反演之鉴。
一个 xio 引理:
[x^{underline n} = (-1)^n (-x)^{overline n}, ;;; x^{overline n} = (-1)^n (-x)^{underline n}
]
反演的关键
[sum_{k=m}^n (-1)^{n-k} egin{bmatrix} n \ k end{bmatrix} egin{Bmatrix} k \ m end{Bmatrix} = [m=n] ag{1}
]
[sum_{k=m}^n (-1)^{n-k} egin{Bmatrix} n \ k end{Bmatrix} egin{bmatrix} k \ m end{bmatrix} = [m=n] ag{2}
]
对 ((2)) 的证明:
[n^m = sum_{i=0}^m egin{Bmatrix} m \ i end{Bmatrix} n^{underline i} = sum_{i=0}^m egin{Bmatrix} m \ i end{Bmatrix} (-1)^i (-n)^{overline i}
]
[sum_{i=0}^m egin{Bmatrix} m \ i end{Bmatrix} (-1)^i sum_{j=0}^i egin{bmatrix} i \ j end{bmatrix} (-n)^j = sum_{j=0}^m n^j sum_{i=j}^m egin{Bmatrix} m \ i end{Bmatrix} egin{bmatrix} i \ j end{bmatrix} (-1)^{i+j}
]
显然等式左右两边各次幂 (n) 的系数都应分别相等, 故
[sum_{i=j}^m egin{Bmatrix} m \ i end{Bmatrix} egin{bmatrix} i \ j end{bmatrix} (-1)^{i+j} = [j=m]
]
一些形式和等效表达式上的区别不需要在意, ((2)) 就得证了。
对 ((1)) 的证明:
[(-1)^m (-n)^{underline m} = n^{overline m} = sum_{i=0}^m egin{bmatrix} m \ i end{bmatrix} n^i
]
[(-n)^{underline m} = sum_{i=0}^m egin{bmatrix} m \ i end{bmatrix} (-1)^{m-i} (-n)^i
]
[n^{underline m} = sum_{i=0}^m egin{bmatrix} m \ i end{bmatrix} (-1)^{m-i} n^i = sum_{i=0}^m egin{bmatrix} m \ i end{bmatrix} (-1)^{m-i} sum_{j=0}^i egin{Bmatrix} i \ j end{Bmatrix} n^{underline j}
]
[= sum_{j=0}^m n^{underline j} sum_{i=j}^m egin{bmatrix} m \ i end{bmatrix} egin{Bmatrix} i \ j end{Bmatrix} (-1)^{m-i}
]
我猜下降幂多项式和普通多项式性质差不多, 所以 ((1)) 就得证了 (大概)
斯特 rin 反演
[f(n) = sum_{k=0}^n egin{Bmatrix} n \ k end{Bmatrix} g(k) Leftarrow=Rightarrow g(n) = sum_{k=0}^n egin{bmatrix} n \ k end{bmatrix} (-1)^{n-k} f(k)
]
证明:
一:从右推左
已知 (g(n) = sum_{k=0}^n egin{bmatrix} n \ k end{bmatrix} (-1)^{n-k} f(k)), 那么
[g(n) = sum_{m=0}^n [m=n] g(m) = sum_{m=0}^n sum_{k=m}^n (-1)^{n-k} egin{bmatrix} n \ k end{bmatrix} egin{Bmatrix} k \ m end{Bmatrix} g(m) = sum_{k=0}^n egin{bmatrix} n \ k end{bmatrix}(-1)^{n-k} sum_{m=0}^k egin{Bmatrix} k \ m end{Bmatrix} g(m) = sum_{k=0}^n egin{bmatrix} n \ k end{bmatrix} (-1)^{n-k} f(k)
]
推完啦!
二:从左推右
草我不会证, 按照上面的方法推出来是个很怪的形式, 日后我会寻找证明的方法。
斯特林数解 (S_k(n))
[S_k(n) = frac{(n+1)^{underline{k+1}}}{k+1} - sum_{i=0}^{k-1}(-1)^{k-i} · egin{bmatrix} k \ i end{bmatrix} · S_i(n)
]
证明:
[n^m = sum_{k=0}^m egin{Bmatrix} m \ k end{Bmatrix} n^{underline k} Leftarrow=Rightarrow n^{underline m} = sum_{k=0}^m egin{bmatrix} m \ k end{bmatrix} (-1)^{m-k} n^k
]
[n^m = n^{underline m} - sum_{k=0}^{m-1} egin{bmatrix} m \ k end{bmatrix} (-1)^{m-k} n^k
]
[S_m(n) = sum_{i=1}^n i^m = sum_{i=1}^n egin{Bmatrix} i^{underline m} - sum_{k=0}^{m-1} egin{bmatrix} m \ k end{bmatrix} (-1)^{m-k} i^k end{Bmatrix}
]
然后就得证了。(关于 (sum_{k=0}^{n-1} k^{underline m} = frac{n^{underline{m+1}}}{m+1}) 这件事, 要用到有限微积分 owo, 具体数学应该是有介绍的)
算法不赘述了, 虽然慢, 但是对模数没有要求。
[left(egin{matrix} n \ m end{matrix}
ight)
]
虚假的容斥原理
(A_i) 为集合, (U) 为全集, (overline{A}) 为 (A) 关于 (U) 的补集。
[igg|igcup_{i=1}^n A_i igg| = sum_{k=1}^n(-1)^{k+1} Bigg( sum_{1le i_1 < cdots < i_k le n} |A_{i_1} cap cdots cap A_{i_k}| Bigg) ag{1}
]
[igg|igcap_{i=1}^n A_i igg| = |U| - igg|igcup_{i=1}^n overline{A_i} igg| ag{2}
]
证明 ((1)) :
考虑一个处于 (igcup_{i=1}^n A_i) 中的元素 (x), 它属于 (m) 个集合 (T_1, cdots, T_m), 那么它对于右边式子的贡献为:
[|{T_i}| - |{T_i cap T_j | i<j}| + cdots + (-1)^{m+1}|{ T_1 cap cdots cap T_m }|
]
[= left(egin{matrix} m \ 1 end{matrix}
ight) - left(egin{matrix} m \ 2 end{matrix}
ight) + cdots + (-1)^{m+1}left(egin{matrix} m \ m end{matrix}
ight)
]
[= Bigg( -left(egin{matrix} m \ 0 end{matrix}
ight) + left(egin{matrix} m \ 1 end{matrix}
ight) - left(egin{matrix} m \ 2 end{matrix}
ight) + cdots + (-1)^{m+1}left(egin{matrix} m \ m end{matrix}
ight) Bigg) + left(egin{matrix} m \ 0 end{matrix}
ight)
]
[= [m=0] + 1 = 1
]
然而显然不能让 (m) 等于 (0) 啊(笑
于是这个式子就得证了。
证明 ((2)) :
随便口胡下感性理解吧, 严格证明以后再补上。
真实的容斥原理
吹毛断发,削铁如泥。 (话说 ([n]) 是不是就是 (2^{{1,cdots,n}}) 啊)
[Bigg| igcup_{i=1}^n A_i Bigg| = sum_{Ssubseteq[n], S
eq emptyset} (-1)^{|S|+1}
Bigg| igcap_{i in S} A_i Bigg| ag{1}]
[Bigg| igcap_{i=1}^n A_i Bigg| = sum_{Ssubseteq[n], S
eq emptyset} (-1)^{|S|+1} Bigg| igcup_{i in S} A_i Bigg| ag{2}
]
[Bigg| igcap_{i=1}^n A_i Bigg| = sum_{Ssubseteq[n]} (-1)^{|S|} Bigg| igcap_{i in S} overline{A_i} Bigg| ag{3}
]
[igg|igcap_{i=1}^n A_i igg| = |U| - igg|igcup_{i=1}^n overline{A_i} igg| ag{4}
]
((2)) 和 ((3)) 本质是一样的:
[sum_{Ssubseteq[n]} (-1)^{|S|} Bigg| igcap_{i in S} overline{A_i} Bigg| = sum_{Ssubseteq[n]} (-1)^{|S|} egin{Bmatrix} |U|- Bigg| igcup_{i in S} A_i Bigg| end{Bmatrix}
]
[= |U|sum_{Ssubseteq[n]} (-1)^{|S|} + sum_{Ssubseteq[n]} (-1)^{|S|+1} Bigg| igcup_{i in S} A_i Bigg|
]
其中,
[|U|sum_{Ssubseteq[n]} (-1)^{|S|} = |U|sum_{i=0}^n inom{n}{i} (-1)^i = |U|[n=1]
]
经典经典容斥问题
不定方程非负整数解计数
不定方程 (x_1 + cdots + x_k = m ;; (m ge 0)) 的非负整数解的个数为 (inom{m+k-1}{k-1}), 由插板法得到。
这个方程再加上 (k) 个限制条件 (x_i le b_i ;;(b_i ge 0)), 求非负整数解的数量,解法如下:
按照 (Bigg| igcap_{i=1}^n A_i Bigg| = sum_{Ssubseteq[n]} (-1)^{|S|} Bigg| igcap_{i in S} overline{A_i} Bigg|) 来转化条件, 就把上界限制改成了下界限制!
那么, 不定方程 (x_1 + cdots + x_k = m ;; (m ge 0)) 加上 (k) 个限制条件 (x_i ge b_i + 1 ;;(b_i ge 0)), 求非负整数解的个数, 解法如下:
在方程右边减去下界和 (sum(b_i+1)), 方程的解就是原来带下界方程的解。
错排计数
递推比较爽, 但是写容斥式子更爽。
还是按照 ((3)) 来写:
[D_n = sum_{i=0}^n (-1)^i inom{n}{i} (n-i)! = n! sum_{i=0}^n frac{(-1)^i}{i!}
]
凑容斥系数的方法
用于将各种形如 (Bigg| ext{balabala}_{i=1}^n |A_i| Bigg|) 的式子转化成 (sum_{S in [n], S
eq emptyset} g(|S|) Big| igcap_{i in S} A_i Big|) 的形式。
假设恰好被 (x) 个集合覆盖的元素对 (Bigg| ext{balabala}_{i=1}^n |A_i| Bigg|) 的贡献为 (f(x)), 大小为 (x) 的集合的容斥系数为 (g(x)), 那么
[sum_{T subseteq S^{'}, T
eq emptyset} g(|T|) = f(|S^{'}|)
]
其中, (S^{'}) 是 (S) 的子集, (S^{'}) 中的下标 (i) 都满足某元素被 (A_i) 覆盖。
设 (|S^{'}| = m), 上式化简为:
[sum_{i=0}^m inom{m}{i} g(i) = f(m)
]
反演,
[g(m) = sum_{i=0}^m (-1)^{m-i} inom{m}{i} f(i)
]
例子:[COCI2009-2010#6] XOR
设第 (i) 个三角形为 (A_i), 要求的就是 (| ext{Xor}_{i=1}^n A_i |)。
考虑容斥, 转为 (sum_{S in [n], S
eq emptyset} g(|S|) Big| igcap_{i in S} A_i Big|)。
(g(m) = sum_{i=0}^m (-1)^{m-i} inom{m}{i} f(i)), 其中 (f(i) = [2
mid i])。
所以
[g(m) = sum_{i=0}^m (-1)^{m-i} inom{m}{i} [2
mid i]
]
[= (-1)^{m+1} sum_{i=0}^m (-1)^{i+1} inom{m}{i} [2
mid i] = (-1)^{m+1} 2^{m-1} ag{$m ge 0$}
]
所以
[| ext{Xor}_{i=1}^n A_i | = sum_{S in [n], S
eq emptyset} (-1)^{|S|+1}2^{|S|-1} Big| igcap_{i in S} A_i Big|
]
问题转化为求若干三角形的交。
由于两个三角形交起来仍然是三角形,交运算有交换律和结合律, 所以现在的问题是如何求两个三角形的交。
#include<bits/stdc++.h>
using namespace std;
const int N = 13;
int n, x[N], y[N], r[N];
void meg(int &x1,int &y1,int &r1,int x2,int y2,int r2) {
// if(x1>x2) {
// swap(x1,x2); swap(y1,y2); swap(r1,r2);
// }
// if(y2>=y1) {
// r1 = max(0, min(y1+r1-y2-(x2-x1), r1));
// x1 = x2, y1 = y2;
// } else {
// r1 = max(0, min(x2+r2-x1,y1+r1-y2));
// y1 = y2;
// }
r1 = min(x1+y1+r1, x2+y2+r2) - max(x1,x2) - max(y1,y2);
r1 = max(r1, 0);
x1 = max(x1,x2);
y1 = max(y1,y2);
return;
}
double calc(int S) {
int X=0, Y=0, R=0;
for(int i=0; i<n; ++i)if((S>>i)&1) {X=x[i+1], Y=y[i+1], R=r[i+1]; break;}
S -= S&(-S);
for(int i=0; i<n; ++i)if((S>>i)&1) meg(X,Y,R, x[i+1], y[i+1], r[i+1]);
return (double)R*(double)R / (double)2;
}
int main() {
cin >> n;
for(int i=1; i<=n; ++i) {
scanf("%d%d%d", &x[i],&y[i],&r[i]);
}
double ans = 0;
for(int S=1; S<(1<<n); ++S) {
int tmp = 0, SS = S;
while(SS) ++tmp, SS-=SS&(-SS);
double nowans = 1<<(tmp-1);
if(!(tmp&1)) nowans = -nowans;
nowans *= calc(S);
ans += nowans;
}
printf("%.1lf", ans);
return 0;
}
min-max 容斥(最值反演owo)
定义 (min(S) = min_{a_i in S} a_i), (max(S) = max_{a_i in S} a_i)。
( ext{min-max})容斥 的形式是这样的:
[max(S) = sum_{T subseteq S} (-1)^{|T|+1} min(T)
]
证明:
将 (S) 内元素 (a_i) 降序排序, 此时 (a_k) 就是 (S) 内第 (k) 大的元素。
左边 (= a_1)
对于右边:
使得 (min(T) = a_1) 的 (T) 只有 ({ a_1 }) 这一种, 贡献为 ((-1)^2 a_1 = a_1)。
对于 (min(T) = a_k ; ; (k > 1)) 的 (T), 首先它必须有 (a_k), 其次 (a_p (p>k)) 不能有, 所以这样的 (T) 共有 (2^{k-1}) 种选法, 通过人类智慧得知(归纳法, 不详细证了。) ,这 (2^{k-1}) 种选法之中, 其中一半的集合大小是奇数,另一半是偶数, 结合 min-max容斥的式子知, 这样的 (T) 贡献为 (0)。
所以 min-max容斥的式子是正确的。