组合数学

加法原理

\(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^m\mod p\)

·\(x,y\le 1000\)

直接递推预处理。

·\(x,y\le 10^5\)\(p\)是质数

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

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

·\(x,y\le 10^{18}\)\(p\)是质数,\(p\le 10^5\)

Lucas定理

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

套一下就可以了。

·\(x,y,p\le 10^5\)

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

·\(x,y\le 10^9,p^c\le10^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_1\le a_2\le\dots\le a_n\)

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

转化后题目变为

\(c_1+c_2+\dots+c_n\le 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\)组询问,\(T\le10^4,k\le n\le10^5\)

暴力的式子:

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

先优化下后面:

\[\sum_{j=1}^iC_i^jj \\=\sum_{j=1}^i\frac{i!}{j!(i-j)!}j \\=\sum_{j=1}^i\frac{i!}{(j-1)!(i-j)!} \\=\sum_{j=1}^i\frac{(i-1)!}{(j-1)!(i-j)!i} \\=\sum_{j=1}^iC_{i-1}^{j-1}i \\=i\sum_{j=1}^iC_{i-1}^{j-1} \\=i\sum_{j=0}^{i-1}C_{i-1}^{j} \\=i\sum_{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\)组询问。\(Q\le20000,n\le100,T\le200\)

问题等价于求有多少回到原点的长度为\(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} \]

posted @ 2020-04-12 21:35  Oply  阅读(491)  评论(3编辑  收藏  举报