组合数学
加法原理
\(n\)类元素,第\(i\)类有\(c_i\)个元素,选一个元素的方案数。
乘法原理
\(n\)组元素,第\(i\)组有\(c_i\)个元素,每组选一个元素的方案数。
排列数
从\(n\)个不同元素中,任选\(m\)个进行排列的方案数。
组合数
从\(n\)个不同元素中,任选\(m\)个的方案数。
加法原理得,方案数为 \(不取第n个的方案数+取第n的方案数\)
计算\(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定理
套一下就可以了。
·\(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\)块板。
长度为\(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\)的正整数解的个数(有序)。
二项式定理
感性证明。
\((x+y)^n\)可以看作\(n\)个\((x+y)\)相乘。
枚举\(x\)出现了几次。取了\(i\)个\(x\),就要取\(n-i\)个\(y\)。
乘上组合数\(C_n^i\)就是有多少种选取\(i\)个\(x\)的方式。
算这玩意:
直接套二项式定理。
上面这东西就是
注意\(n=0\)时答案为\(1\)。
从\(n\)个人中选出不超过\(k\)个人,再在选出的人中选出一些人成为队员,再在队员中选出一个队长,求不同的方案数,答案\(\mod8388608\)。
有\(T\)组询问,\(T\le10^4,k\le n\le10^5\)
暴力的式子:
先优化下后面:
带回去:
因为模数\(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\)
可得转移方程