zoukankan      html  css  js  c++  java
  • 组合数学

    加法原理

    (n)类元素,第(i)类有(c_i)个元素,选一个元素的方案数。

    [sum_{i=1}^{n}c_i ]

    乘法原理

    (n)组元素,第(i)组有(c_i)个元素,每组选一个元素的方案数。

    [prod_{i=1}^{n}c_i ]

    排列数

    (n)个不同元素中,任选(m)个进行排列的方案数。

    [A_n^m=frac{n!}{m!(n-m)!} ]

    组合数

    (n)个不同元素中,任选(m)个的方案数。

    [C_n^m=frac{A_m^n}{m!}=frac{n!}{m!(n-m)!} ]

    加法原理得,方案数为 (不取第n个的方案数+取第n的方案数)

    [C_n^m=C_{n-1}^m+C_{n-1}^{m-1} ]

    计算(C_n^mmod p)

    ·(x,yle 1000)

    直接递推预处理。

    ·(x,yle 10^5)(p)是质数

    预处理(1!,2!,dots,100000!)

    然后直接套公式,取模使用逆元。

    ·(x,yle 10^{18})(p)是质数,(ple 10^5)

    Lucas定理

    [C_n^m \% p= C_{lfloor frac{n}{p} floor}^{lfloor frac{m}{p} floor}C_{n \% p}^{m \% p}\% p ]

    套一下就可以了。

    ·(x,y,ple 10^5)

    线性筛后对(1,2,dots,n)分解质因数,计算每种质因子出现的次数,然后把对所有质因数求个答案,最后乘起来就OK了。

    ·(x,yle 10^9,p^cle10^5),对(p^c)取模

    鸽了。

    插板法

    (x_1+x_2+dots+x_n=m)的正整数解的个数(有序)。

    (m)看成(m)(1),中间有(m-1)个空隙,分成(n)个就是插(n-1)块板。

    [C_{m-1}^{n-1} ]

    长度为(n),值域为([1,m])的不下降子序列个数

    设序列为(a_1,a_2,dots,a_n)

    由题意得,(a_1le a_2ledotsle a_n)

    可以做差分数组(c)(c_i=a_i-a_{i-1})

    转化后题目变为

    (c_1+c_2+dots+c_nle m)的正整数解的个数(有序)。

    [sum_{k=0}^{m-1}C_{k-1}^{n-1}=C_m^n ]

    二项式定理

    [(x+y)^n=sum_{i=0}^nC_n^ix^iy^{n-i} ]

    感性证明。

    ((x+y)^n)可以看作(n)((x+y))相乘。

    枚举(x)出现了几次。取了(i)(x),就要取(n-i)(y)

    乘上组合数(C_n^i)就是有多少种选取(i)(x)的方式。

    算这玩意:

    [sum_{i=0}^nC_n^i(-1)^i ]

    直接套二项式定理。

    上面这东西就是

    [(1-1)^n=0 ]

    注意(n=0)时答案为(1)

    (n)个人中选出不超过(k)个人,再在选出的人中选出一些人成为队员,再在队员中选出一个队长,求不同的方案数,答案(mod8388608)

    (T)组询问,(Tle10^4,kle nle10^5)

    暴力的式子:

    [sum_{i=1}^kC_n^isum_{j=1}^iC_i^jj ]

    先优化下后面:

    [sum_{j=1}^iC_i^jj \=sum_{j=1}^ifrac{i!}{j!(i-j)!}j \=sum_{j=1}^ifrac{i!}{(j-1)!(i-j)!} \=sum_{j=1}^ifrac{(i-1)!}{(j-1)!(i-j)!i} \=sum_{j=1}^iC_{i-1}^{j-1}i \=isum_{j=1}^iC_{i-1}^{j-1} \=isum_{j=0}^{i-1}C_{i-1}^{j} \=isum_{j=1}^iC_{i-1}^{j-1}1^j1^{i-j-1} \=(1+1)^{i-1}=2^{i-1} ]

    带回去:

    [sum_{i=1}^kC_n^i2^{i-1}i ]

    因为模数(8288608=2^{23}),所以直接枚举,(i)超过(23)就不枚举。

    在一个(n)维无限空间中,一开始原点处有一个细胞。 每秒中所有原有细胞都会消亡,并且都在与其曼哈顿距离恰为(1)的所有位置新增一个细胞。求(T)秒后,原点处会有多少细胞。

    (Q)组询问。(Qle20000,nle100,Tle200)

    问题等价于求有多少回到原点的长度为(T)的路径。

    把每一维分开考虑,设(f_{i,j})(i)个维度,长度为(2j)的回到原点路径条数。

    考虑转移。

    枚举这个维度的步数(2 k),从(f_{i-1,j-k})转移。

    总共有(2 j)步,从(2j)里选(2k)步的方案数为(C_{2j}^{2k})

    (2k)步里选(k)步往左,另外(k)步往右的方案数为(C_{2k}^k)

    可得转移方程

    [f_{i,j}=f_{i-1,j-k}C_{2j}^{2k}C_{2k}{k} ]

  • 相关阅读:
    Flutter开发环境搭建
    Android自定义View-圆形图片控件
    浅析对象的创建过程
    Java对象占用内存大小--Java对象的内存结构分析
    对AQS的简单理解及自定义锁的实现
    IntelliJ IDEA插件开发的简单流程
    IOC之运行时注入-实现Activity的布局注入+控件注入+事件绑定
    动态代理+注解+反射实现View的点击事件绑定
    Java中的注解和反射
    利用短信通知的方式在Tasker中实现收到Android手机短信自动转发到微信
  • 原文地址:https://www.cnblogs.com/oply/p/12687836.html
Copyright © 2011-2022 走看看