zoukankan      html  css  js  c++  java
  • 容斥原理

    容斥原理简介(很无耻的把ysy神犇讲课的课件摘抄下来了):

    记f(S)表示满足集合S中至少一个条件的方案数,g(S)表示满足集合S中所有条件的方案数。
    f(S)=Σ(-1)^(|T|-1)*g(T),其中T为S的非空子集。
    通俗地说就是先把满足一个条件的都加上,这时候满足两个条件的被加了两次,所以要减掉一次,然后满足三个条件的被减成0次了,要加上一次…...
    还有另一种形式。
    记h(S)表示不满足集合S中所有条件的方案数。
    g(S)=Σ(-1)^|T|*h(T),其中T为S的子集。
    通俗地说就是先加上所有方案,然后扣掉不满足一个条件的方案,这时候不满足两个条件的被扣了两次,所以要加上一次,然后不满足三个条件的被加回1次了,所以要扣掉一次……

     应用:

    1.对一个n*m的棋盘染色,每格可以是黑色或白色。
    要求每行每列都有黑格。
    求方案数对10^9+7取模的结果。
    n,m<=10^3。

    分析:套用上面的,题目要求的是满足“每行每列”,也就是相当于求g(S)嘛!"所有条件",也就是第二种容斥原理。既然要求不满足题意的行和列,即h(T),

    枚举行数i,列数j,选出i行j列的方案数就是C(n,i) * C(m,j),那么我们怎么知道这i行j列全选白格的方案数呢?我们考虑没有被选上的n-i行,m-j列,这些行和列可以随意的选黑或者选白,也就是说方案数为2^(n-i)(m-j),根据容斥原理,答案为.

    2.对一个n*m的棋盘染色,每格可以是黑色或白色。
    要求存在一行或一列都是黑格。
    求方案数对10^9+7取模的结果。
    n,m<=10^3。

    分析:其实本题和上题是互补的,我们求出f(S)即可,答案为:

    3.对一个n*m的棋盘染色,每格可以是黑色或白色。
    要求存在一行和一列都是黑格。
    求方案数对10^9+7取模的结果。
    n,m<=10^3。

    分析:这个题和上一题不同,或字变成了和字,先对A用容斥原理,答案变为*有i行都是黑格且满足B的方案数,再对B用容斥原理,答案变为有i行j列都是黑格的方案数。化简一下.

    总结:求满足至少一个条件的就用第一条容斥原理,满足所有条件的就用第二条容斥原理。

    一道习题:传送门

  • 相关阅读:
    mac 配置环境变量
    c语言中的0UL或1UL是什么意思
    javascript类型系统——正则表达式RegExp类型
    javascript运算符——算术运算符
    javascript类型系统——Number数字类型
    javascript类型系统——包装对象
    javascript基础语法——表达式
    valueOf()方法
    toString()方法
    javascript基础语法——变量和标识符
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7286785.html
Copyright © 2011-2022 走看看