「学习笔记」数学(二)

写在前面:这篇文章进一步介绍一些基础数学知识,包括组合的进一步研究、特殊的数等。

容斥原理

复习一下最基础的容斥:

\[\left| \bigcup_{i = 1}^n S_i \right| = \sum_{m = 1}^n (-1)^{m-1} \sum_{a_i < a_{i+1}} \left| \bigcap_{i = 1}^m S_{a_i} \right| \]

\[\left| \bigcap_{i = 1}^n S_i \right| = \left| U \right| - \left| \bigcup_{i = 1}^n \bar{ S_{a_i} } \right| \]

Min-Max 容斥

\[\max(S) = \sum_{T \subseteq S} (-1)^{|T|-1}\min(T) \]

kth Min-Max 容斥

一般化的容斥

\[f(S) = \sum_{T \subseteq S} g(T) \]

那么

\[g(S) = \sum_{T \subseteq S} (-1)^{|S| - |T|}f(T) \]

容斥系数

对于最简单的组合容斥\(ans = \sum_{\text{some set s1, s2, ..., sk}} ans(s1 \cap s2 \cap ... \cap sk))f(|s1 \cap s2 \cap ... \cap sk|)\)

要满足假设一个点在\(n\)个集合里,\(\sum_{i = 1}^n {n \choose i} f(i) = [n > 0]\)

最后一步根据题意可以改,\(O(n^2)\)可以求容斥系数\(f\)

还有一种斯特林形式,十分类似,即\(ans = \sum_{x 是一个划分} ans(x) f(|x|)\)

还有一些其他的trick,比如把一个划分的容斥系数定为各部分size的容斥系数乘起来。

例题1:UESTC 1544

假设一个点被选中\(n\)次,容斥系数应该满足\(\sum_{i = 1}^n{n\choose i}f(i) =n\bmod 2\),答案就是\(\sum_{S} { \left\lfloor\dfrac{n}{lcm(S)} \right\rfloor f(|S|)}\)

推荐Blog

斯特林数

贝尔数 Bell

定义\(B_n\)表示把\(n\)个不同元素划分成若干集合的方案数。很多时候在复杂度分析上会用到他。

Bell数的前几项是:

\(1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975\)

递推公式:枚举\(k\)表示多少元素不与最后一个元素在同一个集合。

\[B_{n + 1}= \sum_{k = 0}^n {n \choose k} B_k \]

和第二类斯特林数的关系:\(B_n\)等于第二类斯特林数第\(n\)行之和。

\[B_n = \sum_{i = 1}^n S(n,i) \]

二项式反演

二项式反演常用于解决恰好取若干个的问题

形式1

\[f(n)=\sum_{i=0}^n (-1)^i \binom{n}{i} g(i) \Leftrightarrow g(n)=\sum_{i=0}^n (-1)^i \binom{n}{i} f(i) \]

证明:

\[\sum_{i=0}^n (-1)^i {n\choose i} g(i) \]

\[\sum_{i=0}^n (-1)^i {n\choose i} \sum_{j=0}^i(-1)^j{i\choose j}f(j) \]

\[\sum_{i=0}^n \sum_{j=0}^i(-1)^{i}(-1)^j{n\choose i}{i\choose j}f(j) \]

\[\sum_{i=0}^n \sum_{j=0}^i(-1)^{i}(-1)^j {n\choose j}{{n-j}\choose {i-j}}f(j) \]

\[\sum_{j=0}^n {n\choose j}f(j) \sum_{i=j}^n(-1)^{i-j}{{n-j}\choose {i-j}} \]

\[\sum_{j=0}^n {n\choose j}f(j) \sum_{i-j=0}^{n-j}(-1)^{i-j}{{n-j}\choose {i-j}} \]

\[\sum_{j=0}^n {n\choose j}f(j) [n-j=0]=f(n) \]

注意一下,\((-1)^{i+j}=(-1)^{i-j}\)

形式2

\[f(n)=\sum_{i=0}^n \binom{n}{i} g(i) \Leftrightarrow g(n)=\sum_{i=0}^n (-1)^{n - i} \binom{n}{i} f(i) \]

证明:

\[\sum_{i=0}^n {n \choose i} g(i) \]

\[=\sum_{i=0}^n {n \choose i} \sum_{j=0}^i (-1)^{i-j} {i \choose j} f(j) \]

\[=\sum_{i=0}^n \sum_{j=0}^i (-1)^{i-j} {n \choose i} {i \choose j} f(j) \]

\[=\sum_{i=0}^n \sum_{j=0}^i (-1)^{i-j} {n \choose j} {n-j \choose i-j} f(j) \]

\[=\sum_{j=0}^n {n \choose j} f(j) \sum_{i=j}^n (-1)^{i-j} {n-j \choose i-j} \]

\[=\sum_{j=0}^n {n \choose j} f(j) \sum_{i-j=0}^{n-j} (-1)^{i-j} {n-j \choose i-j} \]

\[=\sum_{j=0}^n {n \choose j} f(j) [n-j=0] \]

\[=f(i) \]

P.S. 感谢why队长完成形式2证明。

实际上也有基于容斥的证明,大概思想就是把容斥的式子和f,g函数对应,以后有时间可以来证,问题不大。

推荐博客:miskcoo:反演魔术:反演原理及二项式反演

接下来看一个例题:Gym 101933K:King's Colors

题意:用恰好k种颜色涂n个结点的树,相邻结点不能同色,问方案数\(\mod 10^9+7\)\(2\leq k\leq n \leq 2500\)

题解

如果是用\(k\)种颜色随便涂,答案就是\(k(k-1)^{n-1}\),根是随意的,其他结点不能和父亲颜色一样。

既然\(\leq k\)很好求,那令\(g(k)\)表示用\(1...k\)这些颜色的涂法,\(g(k)=k(k-1)^{n-1}\)

同时:(我们认为\(f(0)=1\)

\[g(k)=\sum_{i=0}^k{k\choose i}f(i) \]

直接二项式反演:

\[f(k)=\sum_{i=0}^{k}(-1)^{k-i}{k\choose i}g(i) \]

预处理组合数就做完了,时间复杂度\(O(k\log n)\)。(树结构读都不用读)

#include <algorithm>
#include <cstdio>
using namespace std;
const int mo = 1e9 + 7;
const int N = 2510;
int n, k, fac[N] = {1}, fav[N];
int qpow(int a, int b) {
	int ans = 1;
	for(; b >= 1; b >>= 1, a = 1ll * a * a % mo)
		if(b & 1) ans = 1ll * ans * a % mo;
	return ans;
}
int C(int x, int y) {
	return x < y ? 0 : 1ll * fac[x] * fav[y] % mo * fav[x - y] % mo;
}
int main() {
	scanf("%d%d", &n, &k);
	for(int i = 1; i <= k; i ++) fac[i] = 1ll * fac[i - 1] * i % mo;
	fav[k] = qpow(fac[k], mo - 2);
	for(int i = k; i >= 1; i --) fav[i - 1] = 1ll * fav[i] * i % mo;
	int ans = 0;
	for(int i = 0; i <= k; i ++) {
		int t = 1ll * i * qpow(i - 1, n - 1) % mo * C(k, i) % mo;
		if((k + i) & 1) (ans += mo - t) %= mo;
		else (ans += t) %= mo;
	}
	printf("%d\n", ans);
	return 0;
}
posted @ 2020-03-02 16:28  hfhongzy  阅读(429)  评论(5编辑  收藏  举报