正睿19暑期B班DAY3 组合数学再放送

持续掉线……重连中……[fail:因为太菜]……

容斥原理

好吧其实它就是长这样的东西的变种

\[\sum_{S \subseteq U} f(S) (-1)^{|S| + 1}\]

然后我们用它来计算一下欧拉函数公式

众所周知,欧拉函数就是1~n中与n互质的数

如果\(n = p_1 ^ {r_1} * p_2^{r_2}……*p_m^{r_m}\)

那么补集转换一波,欧拉函数可以看作\(n - |p_1的倍数 \cup p_2的倍数 \cup ……\cup p_m的倍数|\)

看到这个东西 我们觉得十分熟悉,就把它变成

\(\sum_{T \in [n]} (-1)^T |\cap_{i \in T} S_i|\)

因为\(|\cap_{i \in T} S_i| = \frac{n}{\prod_{i \in T}p_i}\)

所以原式$   = \sum_{T \in [n]} (-1)^T \frac{n}{\prod_{i \in T}p_i}$

又因为\(\prod_{i = 1}^{n} (1 + x_i) = \sum_{S \in [n]}(\prod_{i \in S} x_i)\)

所以原式 \(= \sum_{T \in [n]} (-1)^T \frac{n}{\prod_{i \in T}p_i}\)

$ = n \sum_{T \in [n]} (-1)^T \frac{1}{\prod_{i \in T}p_i}$

$ = n\prod_{i = 1}^{m} (1 - \frac{1}{p_i})$


  • 已知\(x_1 + x_2 + …… + x_n = A, 0 \leq x_i \leq C_i\)

    求有多少组解

如果是问\(p \leq x_i\)的话就很好办 先强行去掉p就好了

比如要求\(1 \leq x_1\)其他\(x_i\)无限制的话

就相当于解所有\(x_i\)都无限制的\(x_1 + x_2 + ... + x_n = A - 1\)

然后把解得的\(x_1\)加上一就好了

所以这里 \(0 \leq x_i \leq C_i\)的解法就是

ans = 无限制解数 - 只限制\(C_1 \leq x_1\)解数 - 只限制\(C_2 \leq x_2\)解数 - ....... + 只限制\(C_1 \leq x_1\)\(C_2 \leq x_2\)解数 + 只限制\(C_2 \leq x_2\)\(C_3 \leq x_3\)解数 + .....

这样容斥下去就行了


  • 有一个长度位为n - 1的由"<"和">"组成的序列

    你需要计算使得 p[i]<p[i+1] 当且仅当 s[i] 为 < 的排列 p的数量

    n<=10^5

如果这个序列里只有"<"就很好办 递增就好了嘛

考虑把所有">"变成无限制 得到的排列集合显然包含原来">"在时的排列

而这个集合里多出来的排列 就是该">"变成"<"后的合法排列

那么就可以容斥了

考虑若干个">"变成"<"合法数量

被变成无限制的">"就把原生的次生的"<"划分成了一些连续"<"区间

比如这个序列 < < ? ? < ? < 就被划分成A < B < C | D | E < F | G < H

每个区间里的元素是递增的(比如第一个区间里A < B < C)

所以这时排列的种类数就是\(\frac{n!}{len_1!len_2!...len_k!}\)(k是被划分成的区间数)

ans = 所有">"变成无限制合法数量 - 一个">"变成"<",其他">"变成无限制合法数量 + 两个">"变成"<",其他">"变成无限制合法数量 .....

然而\(n \leq 1e5\) 事情就变得尴尬起来

考虑每一个">"变成"<"之后会对系数贡献-1 变成"="会贡献1(所谓贡献-1就是让系数乘上-1)

那么推一推就可以发现一件有趣的事情

\(f[i] = \sum f[j] \frac{1}{(i - j)!} (-1)^{j + 1 -> i - 1位置之间的">"数量}\)(f[i]表示第i个">"之前的答案,也就是截至第k个区间)

最后答案就是\(n! f[k]\)

p.s. dls说到了个很有趣的东西

随机1~n的排列的大小关系 和随机n个(0, 1)实数的大小关系是等价的


  • SetAndSet

    有n个数,n<=50,要分成⾮空的两组,对每组把所有数and起来。要使得结果⼀样。⽐如{1,2,3,4},那么{1,2},{3,4}的分组是合法的,因为1 and 2 = 0 ,3 and 4 = 0。

    每个数<=2^20。

补集转换。考虑怎么才能不一样呢?对于某一位,序列可以看作由0,1组成。

如果要不同的话 划分至少要在一位一侧有一,另一侧全是零

然而这个很好统计 并查集+搜索枚举就可以了

对于每一种情况的结果都是\(2^{连通块个数} - 2\)


  • Min-Max容斥

\(max(x_1, x_2, x_3, ... , x_n) = x_1 + x_2 + ... + x_n - min(x_1, x_2) - min(x_2, x _3) ...\)

这个东西常常被用在期望的计算中


  • 每次产⽣S的概率为p(S),并问全集的期望步数。 |U|<=20

一个集合被产生的期望步数,就是它里面最后一个元素被产生的期望步数

那么\(E[max_{i = 1}^{n} x_i] = \sum_{T \subset [n],T \neq \emptyset}(-1)^{|T|}E[min_{i \in T}x_i]\)

而T中第一个元素被选到的概率

就是T所有子集或者与T相交的集合中被选到一个的概率

但与T相交的集合非常不好算

所以把它变成选择不是上述以外其他集合的概率

也就是\(1 - \sum_{S \subset U\T}P(S)\)

期望步数就是\(\frac{1}{1 - \sum_{S \subset U\T}P(S)}\)

补充一下集合前缀和的求法

for(int i = 0; i < n; ++i)
    for(int S = 0; S <= (2 << n) - 1; ++S)
        if(S & (1 << i)) f[S] += f[S - (1 << i)];

  • 一个课件有n道题,每次再放送会以p概率讲到

    求讲遍所有题的再放送期望次数

这道题和上一道极为类似

\(ans = \sum_{i = 1}^{n} (-1)^{i} \tbinom{n}{i} \frac{1}{1 - (1 - p)^i}\)


  • 「PKUWC2018」随机游走

题面link

看到遍历..期望..就四舍五入是Min-Max啦

大致思路就是递推出每个点被走到的期望+Min-Max容斥

小菜鸡我比较感兴趣的是递推那部分

(以下式子建议手推一下,直接看不易理解)

快乐高消的时候我们有\(f_u = 1+ \frac{1}{d_u}(\sum_{v \in ch[d]}f_v + f_{fa})\)

复杂度\(O(2^n n^3)\)

强行\(f_u = A_u f_{fa} + B_u\)

则移项一下有\((1 - \frac{\sum A_v}{d_u})f_u = \frac{1}{d_u}f_{fa} + \frac{1}{d_u}\sum B_v + 1\)

然后我们的叶子有\(f_v = f_{fa} + 1\) 有A,B,而根有f[root] = 0

所以从下向上收获一波A, B,再从上到下收获f[]就好啦

复杂度\(O(2^n n)\)

猜你喜欢

转载自www.cnblogs.com/hjmmm/p/11272141.html
今日推荐