zoukankan      html  css  js  c++  java
  • 「总结」容斥。一.容斥原理

    容斥原理。

    最近被容斥虐惨了,要总结一下知识点和写一些题解。

     一.容斥原理

    首先是很熟悉的奇加偶减的式子。

    令$M$为$S$的集合。

    $$left|igcuplimits_{i=1}^{n}S_i ight|=sumlimits_{Csubseteq M}^{n}(-1)^{size(C)-1}left|igcaplimits_{Tsubseteq C}T ight|$$

    这个式子就是最重要的了。

    所有的反演以及容斥系数的确定,原理都是他。这也是容斥原理是原理的原因。

     

    证明的话。用二项式定理$(1-1)^n$就好了。

     

    然后就是一道题。

    很裸的容斥题。我当时很是不会做想了好久。

    $fr.$八。

    最重要的容斥思想之一,补集容斥。

    题目要求求一个区间内能被八整除而不能被给定的几个数整除的数的个数(给定的数不超过20个)

    那么很显然的思路。

    先求出能被八整除的数的个数,然后剪掉这些数里能被八整除又能被给定的数整除的数的个数。

    那么我们利用最上面那个式子。

    首先枚举子集,然后用子集中的元素和八求出他们的最小共倍数,区间中能被这个最小共倍数整除的数的个数就是能被子集中的元素和八同时整除的数的个数,也就是所谓交集,代入上式求解。

    这就是奇加偶减最经典的应用了。

     

    一道题还是太少了。

    还有一道题。

    $se.$isn。

    给出一个长度为n的序列A(A1,A2...AN)。如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止。求有多少种不同的操作方案,

     

    很久之前做的$dp$题,很经典的容斥与$dp$结合。

    首先设$dp[i][j]$为长度为$i$,最后一个数的位置$j$的非降子序列个数,$g[i]=sumlimits_{j=i}^{n}dp[i][j]$

    $dp$数组用树状数组优化转移可以在$O(n^2logn)$做到。

    那么我们已经的到了$g$数组了。

    每种长度贡献的方案就是$A_n^i$

    答案看似就是

    $$ans=sumlimits_{i=1}^{n}g[i](n-i)!$$

    其实不然。

    因为这个序列不可能以各种顺序删除而不会在长度为$i+1$的时候变为非降的,如果变成了,那么就不能删掉最后一个了。那么要剪掉没一个序列在长度为$len+1$的时候就变为非降的贡献。

    所以:

    $$ans=sumlimits_{i=1}^{n}(g[i](n-i)!-g[i+1](n-i-1)!(i+1))$$

    复杂度$O(n^2logn)$

    $th.$卡农

    之前甚至忘记了这道好题了啊。

    想当年在没开网的时候我刚了3天做出来还是很自豪的。

    化简题意:对于一个给定的集合$S={1...n}$,选取其中$m$个子集要求子集非空,不能相同,并且每个出现过的元素出现次数是偶数。

    一开始推组合,发现根本不可做,一直推不出来把我恶心的要命。

    之后想到可不可以用有序来做,最后除一个阶乘就行了。

    前$m-1$段确定的时候第$m$段就已经唯一确定了(补之前的奇数次元素就完事了)。

    设$dp[i]$为前$i$个集合的合法情况。这个时候确定$i-1$个集合的总方案数就是$A_{2^n-1}^{i-1}$很显然这只满足了偶数次的条件,还要剪掉其他不合法情况。

    两种不合法。

    1.最后一个集合也就是第$i$个是空的,那么前$i-1$个就已经是合法的了,这部分贡献就是$dp[i-1]$

    2.重复了。我们另外拿出那个重复的集合,那么剩下的部分就只有$i-2$个集合了。

    那么重复的集合的种类就是$2^n-1-(i-2)$枚举这个集合所在的位置,那么有$i-1$种情况。

    所以得到递推式。

    $$dp[i]=A_{2^n-1}^{i-1}-dp[i-1]-dp[i-2](2^n-1-(i-2))(i-1)$$

    $$ans=dp[m]$$

    $fo.$国际影星

    装压容斥。

    T2.

    看一下数据范围:猜一下是$O(3^n)$

    子集题我首先考虑了子集反演。

    设$g[S]$为交集是$S$的子集情况下的方案数,$f[S]$是恰好的方案数。

    $$g[S]=sumlimits_{Tsubseteq S}f[T]$$

    反演得到。

    $$f[S]=sumlimits_{Tsubseteq S}(-1)^{left|S ight|-left|T ight|}g[T]$$

    发现根本不可做,因为交集是子集的集合根本算不出来。

    考虑补集容斥。

    那么我们需要让两个点能到的点没有交集即可。

    因为两个点必然有自己能到的范围,所以枚举到达集合,然后让两个集合之间没有交点就可以了。

    考虑构造这样两个集合,并算出方案。

    $dp[S]$让$1$到达$S$中的点的方案数。

    $g[S]$让$2$到达的方案数。

    预处理数组$e[S]$为$S$中的边数。

    设$mx$为全集。

    枚举$1$所在的集合$T$得到:

    $$dp[S]=2^{e[S]}-sumlimits_{Tsubseteq S}dp[T]2^{e[S xor T]}$$

    $g$的转移也类似。

    在统计答案的时候,枚举全集的子集$S$,同时枚举$S$补集的子集,同样原理转移即可。

    $$ans=2^{e[mx]}-sumlimits_{Ssubseteq mx}sumlimits_{Tsubseteq mx xor S}dp[S]g[T]2^{e[mx xor S xor T]}$$

    复杂度是$O(3^n)$

     

    和wmz的暴力对拍结果,n=8,m=22。

    暂时就这么多。

  • 相关阅读:
    POJ 2991 Crane(线段树)
    HDU 1754 I Hate It(线段树)
    HDU 1754 I Hate It(线段树)
    HDU 1166 敌兵布阵 (线段树模版题)
    HDU 1166 敌兵布阵 (线段树模版题)
    Tree Recovery
    Tree Recovery
    情人节的电灯泡(二维树状数组)
    情人节的电灯泡(二维树状数组)
    【LeetCode】Validate Binary Search Tree 二叉查找树的推断
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/11631706.html
Copyright © 2011-2022 走看看