排列组合&容斥

排列组合

  • 排列组合的题目,一般看起来都很复杂,但都可以拆分成一个个最基本的小问题,再通过加法原理&乘法原理合并。

  • 当然,如果有时候正向拆分很困难,可以试试反向拆,即所有情况-不满足的情况(这种容斥思想会在下面详细说明)

  • 分析小问题时弄清楚条件:是不是小球放进盒子的类型?有没有编号?可不可以有空盒?...

  • 小练手:

    • 问题一:

      一副n种取值,m种花色的扑克,从中选5张,求两对同值的方案数

      • 先考虑同值的是哪两种值,共Cn2种方案

      • 而对于每一种取值取两张,都有Cm2种方案

      • 最后一张牌,要与前面的两种取值不同,就是(n2)m方案,

      • 相乘即可。

    • 问题二:

      n个男生,m个女生,2名老师排队,求满足条件的方案数

      1.两个女生不能相邻

      2.老师也不能相邻

      • 方法一:

        • 思考:因为老师不能相邻,所以他们之间一定夹了学生,又因为女生不能相邻,所以老师之间要么夹了一个女生,要么夹了一个男生和其它学生(也可以没有其它学生)
        • 如果两老师中间夹了一个女生:把这三个人当1个男生,问题转化为:n+1个男生中插m1个女生的方案数乘上2×m,即Cn+1+1m1×(n+1)!×(m1)!×2
        • 两老师之间夹了一个男生和其它学生:考虑先在n个男生中差两个老师,然后再在这n+2个人中插m个女生,答案为n!×Cn+12×2×Cn+3m×m!
        • 最后相加。
      • 方法二:

        • 满足条件的方案=满足条件1的所有方案-满足条件1且不满足条件2的方案。
        • 满足条件1的所有方案:将老师看作2个男生,问题转化为“n+2个男生中插m个女生的方案数”,即Cn+2+1m×(n+2)!×m!
        • 满足条件1且不满足条件2的方案:将老师绑在一起(绑法有两种),看作1个男生,问题转化为“n+1个男生中插m个女生的方案数乘上2”,即Cn+1+1m×(n+1)!×m!×2
        • 最后相减。
  • 组合意义
    通过对问题组合意义的分析,可以快速对复杂问题化简,不过还是得注意细节,不然很容易出错。

    • 问题一:

      (0,0)只能向上或向右走到(n,m)的方案数。

      • 其实就是对n+m步决策向上或右中选n个向上或m个向右,所以答案为Cn+mnCn+mm
    • 问题二:

      证明Cn+r+1r=i=0rCn+ii

      • 先将Cnm转化为走路问题,原式就转化为"从(0,0)走到(n+1,r)的方案数"=i=0n(0,0)走到(n,i)的方案数
      • 而从(0,0)走到(n+1,r)可以转化为从(0,0)到达(n,i)i[0,r]之后向右一步,然后一直向上。所以就是上面式子所表达的。
    • 问题三:

      允许重复的组合:从A={1,2...n}中选r个元素{a1,a2...ar},并且允许重复选取一个元素多次的方案数。

      • 把问题转化为:把这r个元素进行划分,分成n个部分(可以为空),{a1...aj|aj+1...ak||ak+1...ar}。并且把分成的n段分别是集合A中的第i个元素,如果这一段是空的就表示没有选第i个元素(因为集合并不要求)。
      • 发现如果n个部分都不能为空,那就可以运用插板法,在r个元素的r1个空格之间选n1个插上隔板,作为分组的端点。
      • 而因为分组可以为空,我们可以先加入n个额外的元素,参与插板。这样,在最后分好的n个部分每个都减1个元素。这样就可以转化为可以为空的插板问题。
      • 所以答案为Cn+r1n1
    • 问题四:

      n个元素的集合S={0,1,...n}和整数k,从S中选取k×(k+1)2个子集,构成一个边长为k的三角形:

      A1,1

      A2,1,A2,2

      A3,1,A3,2,A3,3

      ......

      Ak,1,Ak,2,Ak,3......Ak,k
      要求满足Ai,jAi,j1,Ai,jAi1,j的子集选取方案数

    • 由于集合S的各个元素是不同的,也可以说各个元素之间是相互独立的,那么我们就可以单独对每一个元素考虑。

      • 而如果Ai,j没有当前的元素,那么以Ai,j为左上角,Ak,k为右下角的矩形所覆盖的区域都应该没有这个元素。

      • 如此一来,如果我们将有有这个元素的区域和没有这个元素的区域画上一条分界线,如图:

      • 如果以A1,k左下角为原点建立坐标系,感觉这条分解线一定会经过(0,0)(i,ki)i[0,k],并且一定是向上或向右坐标不断递增的,为什么呢?

      • 可以自己想象一下,在一个个矩形的覆盖下:一定不会向凹的情况,并且设Ax,yx最小的无元素的子集,那么Ax,x一定是没有这个元素的,那么对应的分界线也就会到Ax,x的左上角,也就是(x1,kx+1)

      • 这样,问题就转化为了求从(0,0)走到(i,ki)i[0,k]的方案数的问题

      • 发现,无论i为多少,都要走k步,那么就可以把问题看做是有k个决策,每次向上或向右,方案数自然是2kn个独立的元素方案数相乘,所以答案就是2nk

      • 同时,这也解释了(n0)+(n1)++(nn)=i=0n(ni)=2n

容斥

  • 容斥解决的是满足多个条件的方案数的问题,这里可以把每个条件转化为集合,例:

    • |U|:所有情况的方案数
    • Si:满足条件i的方案数
    • |i=1nSi|:满足任一一个条件的方案数
    • |i=1nSi|:全部条件都满足的方案数
  • 容斥的核心思想是对“至少(至多)”和“恰好(一般是)”之间的转换,重点是弄清楚哪种方案数容易求,相关的式子如下:

    • |i=1nSi|=m=1n(1)m1ai<ai+1|i=1mSai|
    • |i=1nSi|=|U||i=1nSi¯|
  • 问题一:

    n 种烹饪方法,且会使用 m主要食材

    使用烹饪方法 i 和主要食材 j 会做 ai,j 道不同的菜

    对于一种包含 k(k1) 道菜的搭配方案而言,要求:

    • 每道菜的烹饪方法互不相同

    • 每种主要食材至多在一半的菜(即 k2 道菜)中被使用

    求搭配方案数

    • 先分析要求一,要求烹饪方法互不相同,感觉可以依次考虑对每种烹饪方法进行决策,在当前烹饪方法做不做菜?用哪种主要食材做?然后记录当前状态,以及决策对当前状态的影响,这就是一个dp了。
    • 可是发现要求二根本不好表示状态,因为对于每种食材都要满足条件,即|i=1nSi|。但发现不满足条件二的方案很好求,即|i=1nSi¯|,因为只能有一种主要食材会超过一半,在dp时只需要记录一个主要食材的选用次数就可以了。
    • 于是考虑第二个式子|i=1nSi|=|U||i=1nSi¯|。通过dp计算满足要求一的所有情况数,和满足要求一而不满足要求二的方案数。
    • 注意此题dp状态需要优化,但与本次主题关联不大,故不展开分析。
  • 问题二:

    一个n×m的棋盘,用c种颜色染色,求满足条件的方案数

    • 棋盘的每一个小方格既可以染色(染成c种颜色中的一种),也可以不染色。
    • 棋盘的每一行至少有一个小方格被染色。
    • 棋盘的每一列至少有一个小方格被染色。
    • 每种颜色都在棋盘上出现至少一次。
    • 看上去很难,既要考虑颜色,又要考虑每一行,每一列,感觉特别不可做...
    • 我们先将颜色单独考虑。
    • 发现“出现至少一次”可以看成每种颜色都要用,即|i=1nSi|,而我们发现如果有某几种颜色不用,其它颜色不考虑用不用的方法好像很好求((其它颜色数+1)^要填的格子数),即|i=1nSi¯|。通过式子一和式子二共同转化,|i=1nSi|=|U||i=1nSi¯|=|U|m=1n(1)m1ai<ai+1|i=1mSai|
      *ai<ai+1|i=1mSai¯|的意义是所有组m个颜色不用的方案数,组数就是c种颜色中选m种颜色,即(Cm)组,为了表述方便,我们设f[i]表示在棋盘上用最多用i种颜色满足要求一、二的方案数(这个待会去求),而一组的答案就为f[cm],与组数相乘即可,而全集是f[c](最多用c种颜色就是所有情况)。所以答案为ans=f[c]i=1cf[ci](ci)(1)i1
    • 类似的,计算f[i]的时候所要考虑的要求一、二,也可以通过上面的容斥分析得到。还是通过上面的式子转化,不过此时的aj<aj+1|j=1kSaj¯|就是所有组k列完全不涂色的方案数,一组的答案这么统计:对每一行单独考虑,答案数为(i+1)mk,可是一行不能全为空,就要减去一,n行都是独立的,相乘就是((i+1)mk1)n。这里全集就是当k=0时的值(0列完全不涂色就是所有的情况),所以f[i]=((i+1)m1)nk=1m(mk)((i+1)k1)n(1)k1
    • 综合起来就可以了。

本文作者:qwq_123

本文链接:https://www.cnblogs.com/qwq-123/p/15905690.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   qwq_123  阅读(129)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起