zoukankan      html  css  js  c++  java
  • 【BZOJ2839】集合计数&&【BZOJ3622】已经没有什么好害怕的了

    再谈容斥原理
    来两道套路几乎一致的题目
    【BZOJ2839】集合计数
    Description
    一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007。(是质数喔~)
    首先我们发现他要求取出的集合是不同的
    所以通常的套路是容斥令一个东西
    在保证取出的集合是不同的情况下求出那个时候的答案
    因为如果按照集合重复来容斥就比较复杂
    我们考虑交集至少为i的方案数
    有f(i)=C(n,i)*(2^(2^(n-i))-1)
    这个是什么意思呢,首先求出i个的位置
    然后剩余的位置构成的子集有2^(n-i)个
    然后我们在里面选C(X,1)+C(X,2)+C(X,3)+...+C(X,X)=2^(2^(n-i))-1
    然后就开始套路了,也算是彻底认识了容斥
    接下来就是如何算容斥系数的事情了
    我们考虑这样来算:计算它在之前被算了多少次
    以小学的3个元素的维恩图举例
    A,B,C =1
    那么AB(其他同)算了2次 即C(2,1)
    而其实际需要1次,所以-1
    而ABC算了 C(3,1)-C(3,2)
    而其实际需要1次,所以+1
    也就是在计算i的时候大小为j的被计算了C(i,j)次
    在这道题里
    f(k)=1
    f(k+1)=-C(k+1,k)
    f(k+2)=-C(k+2,k)+C(k+1,k)*C(k+2,k+1)
    而很套路的公式是
    C(n,m)×C(m,s)=C(n,s)*C(n-s,n-m)
    所以啊。。就可以推出f(i)的abs等于C(i,k)这件事情


    【BZOJ3622】已经没有什么好害怕的了
    又是一道套路题。。
    首先排序显然,但随便yy一下好像没啥做法
    然后还是一件很有技巧的事情
    f[i][j]表示考虑到i,已经确定的数中有j个药片>糖果
    然后最重要的性质出来了:
    对于i‘>i 那么i’满足的范围包含i的范围
    所以就可以搞dp了
    f[i][j]=f[i-1][j]+f[i-1][j-1]*(k-j+1) (k表示最大满足范围)
    为什么转移是这样的呢?
    因为我的f[i-1][j]转移过来是不考虑它填在哪
    然后dp完开始套路
    注意到我们的f现在的实际意义是至少有j个
    所以我们就可以愉快的和上一题一样容斥了
    最终答案就等于
    sigma(f[n][j]*(-1)^(..)C(j,k)------->这一项是容斥系数);

  • 相关阅读:
    乌龟棋 (codevs 1068)题解
    全排列 (codevs 1294)题解
    最小伤害 题解
    编码问题 题解
    基础DAY3-运算符 逻辑运算符 if elif
    图解算法——合并k个排序列表(Merge k Sorted Lists)
    算法图解——组合求和( Combination Sum)
    make命令使用 & makefile编写详解
    并发工具CountDownLatch源码分析
    线程局部变量ThreadLocal实现原理
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8886987.html
Copyright © 2011-2022 走看看