容斥原理。
最近被容斥虐惨了,要总结一下知识点和写一些题解。
1.容斥原理
首先是很熟悉的奇加偶减的式子。
令$M$为$A$的集合。
$$\left|\bigcup\limits_{i=1}^{n}S_i\right|=\sum\limits_{C\subseteq M}^{n}(-1)^{size(C)-1}\left|\bigcap\limits_{T\subseteq C}T\right|$$
这个式子就是最重要的了。
所有的反演以及容斥系数的确定,原理都是他。这也是容斥原理是原理的原因。
证明的话。用二项式定理1-1就好了。
然后就是一道题。
很裸的容斥题。我当时很是不会做想了好久。
八。
最重要的容斥思想之一,补集容斥。
题目要求求一个区间内能被八整除而不能被给定的几个数整除的数的个数(给定的数不超过20)
那么很显然的思路。
先求出能被八整除的数的个数,然后剪掉这些数里能被八整除而不能被给定的数整除的数的个数。
那么我们利用最上面那个式子。
首先枚举子集,然后用子集中的元素和八求出他们的最小共倍数,区间中能被这个最小共倍数整除的数的个数就是能被子集中的元素和八同时整除的数的个数,也就是所谓交集,代入上式求解。
这就是奇加偶减最经典的应用了。
一道题还是太少了。
还有一道题。
isn。
给出一个长度为n的序列A(A1,A2...AN)。如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止。求有多少种不同的操作方案,
很久之前做的$dp$题,很经典的容斥与$dp$结合。
首先设$dp[i][j]$为长度为$i$,最后一个数的位置$j$的非降子序列个数,$g[i]=\sum\limits_{j=i}^{n}dp[i][j]$
$dp$数组用树状数组优化转移可以在$O(n^2logn)$做到。
那么我们已经的到了$g$数组了。
每种长度贡献的方案就是$A_n^i$
答案看似就是
$$ans=\sum\limits_{i=1}^{n}g[i](n-i)!$$
其实不然。
因为这个序列不可能以各种顺序删除而不会在长度为$i+1$的时候变为非降的,如果变成了,那么就不能删掉最后一个了。那么要剪掉没一个序列在长度为$len+1$的时候就变为非降的贡献。
所以:
$$ans=\sum\limits_{i=1}^{n}(g[i](n-i)!-g[i+1](n-i-1)!(i+1))$$
复杂度$O(n^2logn)$
2.反演原理
原文地址:https://www.cnblogs.com/Lrefrain/p/11631706.html