zoukankan      html  css  js  c++  java
  • 组合与计数

    组合数学与计数

    即使这是小奥,但也阻止不了窝再学一遍(笑

    总的来说,计数问题在(NOIp)中还是占有一席之位的。

    快速过一遍。

    基本计数原理

    一些原理:加法原理,减法原理,乘法原理。

    容斥原理:

    很好理解,画个Venn图就很快明白了。

    img

    略提摩根律:

    $C_S(P∩Q)=(C_SP)∪(C_SQ)C_S(P∩Q)=(C_SP)∪(C_SQ) ( )C_S(P∪Q)=(C_SP)∩(C_SQ)$

    计数问题常见技巧:

    • 当直接统计具有一种性质的事物个数较为困难时,考虑统计不具有这种性质的事物个数,再用总数减去这个值。
    • 正向的解集变成其补集的交集,二者等价。
    • 直接算并集大小较为困难,但是算交集大小相对容易(或者相反),有时也可用摩根律转换为补集的交或并。
    • 当我们需要计算一些带特殊条件的方案数时,可以用一些等价替代的方法。具体来讲,我们构造一个双射(一一映射),将每一种原问题的方案映射为新问题的一种方案,并使答案更容易计算。

    捆绑法:也称整体法,在计数时,如果要求若干物品相邻,则可以将它们作为一个整体来进行计数。

    插空法:如果要求若干物品两两不相邻,可以先将其他物品放好,然后将这些物品插入空当中,进行计数。

    隔板法:将不可区分物品分配问题/不定方程整数解问题转化为插板组合问题。

    看几个例题。

    1.把 n 个相同的苹果分给 k 个人,要求每个人至少分到一个,求方案数。

    解:应用隔板法,这个问题相当于将(n)个不同物品划分成(k)份,即(dbinom{n-1}{k-1})

    其实可以看作解不定方程(sum^n_{i=1}x_i=n)这个方程的解集的元素总数。

    2.变式:把 n 个相同的苹果分给 k 个人,每个人可以分到0个,求方案数。

    解:仍然是隔板法,我们想象加入(k)个空气苹果(极限情况为没有一个人拿到苹果),分到这种苹果的人相当于分到0个苹果,那么问题转化为将(n+k)个物品划分成(k)份,即(dbinom{n+k-1}{n-1})

    排列组合

    根据乘法原理,容易得出:

    [dbinom{n}{m}=C_n^m=frac{n!}{m!(n-m)!}\ P_n^m=frac{n!}{(n-m)!} ]

    几个简单的性质:

    [dbinom{n}{0}=1,dbinom{n}{1}=n,dbinom{n}{2}=frac{n(n-1)}{2}\ dbinom{n}{m}=dbinom{n}{n-m}\ frac{m}{n}dbinom{n}{m}=dbinom{n-1}{k-1} ]

    组合数递推公式:

    [dbinom{n}{m}=dbinom{n-1}{m-1}+dbinom{n-1}{m},k>0 ]

    一般组合数求法:

    • 递推
    for(int i=0;i<n;++i){
    	C[i][0]=1;
        for(int j=1;j<=i;++j){
    		C[i][j]=C[i-1][j-1]+C[i-1][j];
        }
    }
    
    • 逆元(在模p的意义下)

    前置技能:对于任意一个整数(x),它在模(p)意义下除以一个整数(y)的答案等价于它乘上除数的逆元。

    (a/bmod{p}=a*inv(b) mod{p}),其中 (inv)表示逆元。

    [egin{align} dbinom{n}{m}mod p &=frac{n!}{m!(n-m)!}mod p\ &=n!*inv(m!)*inv((n-m)!)mod p\ &=n!*(m!*(n-m)!)^{p-2}mod p end{align} ]

    用快速幂即可。

    • lucas

    我不会。

    二项式定理

    这个定理其实是显然的。

    [(x+y)^n=sum^n_{k=0}dbinom{n}{k}x^{n-k}y^k ]

    再看几个例题。

    1.错位排列:有 n 个信封和 n 封信,一一对应,求把每封信都装错信封的方案数。

    解:利用容斥原理,考虑它们补集的交集,这显然可以用容斥去做。对于指定的(k)封信,我们假设它们装对了,那么方案数是((n-k)!)种。而指定(k)封信的方案数是(dbinom{n}{k}),根据乘法原理,我们得到答案:(sum^{n}_{k=0}(-1)^kdbinom{n}{k}(n-k)!=sum^{n}_{k=0}(-1)^kfrac{n!}{k!})

    2.JSOI2011 分特产

    有 n 个同学,m 种特产,每种特产有 $a_i $个,需要分给每个同学,满足每个人至少分到一个,求方案数。
    n, m ≤ 1000, (a_i) ≤ 1000。答案对 (10^9 + 7) 取模。

    解:这其实是一道变种的隔板法,我们把需要的答案统计起来即可。考虑一种容斥的做法,即像上面那题一样,考虑补集的交集。假设有(k)个同学一个土特产都没分到,方案数为(f(k))。易得出答案:(sum^n_{k=0}(-1)^kdbinom{n}{k}f(k))。考虑(f(k)),由于有(m)种土特产,它们对解的贡献相互独立,所以我们对每种土特产计一次答案,由上面的变式得有空位的插板的方案总数:(f(k)=prod^m_{i=1}dbinom{a_i+(n-k)-1}{n-k-1})

    不难看出,这些题目都具有相同的性质,即正面求解集较难,我们便尝试转换为求解集的补集的交集,然后用容斥去解这个交集。

    容斥在省选中好像算比较简单的?不管他,我菜。

    其实还是比较好理解的。

  • 相关阅读:
    JSON的数据格式
    KMP 算法
    爬虫原理
    快速求小于N的所有素数
    对程序员最具影响的书籍
    实现下拉更新UITableView EGORefreshTableHeaderView
    温习C/C++笔记——浅谈琐碎知识点(1)
    C++内存对齐
    SQL Server 安装程序无法获取 ASPNET 帐户的系统帐户信息
    Asp.Net生命周期事件
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/11279866.html
Copyright © 2011-2022 走看看