[复习资料]组合计数学习笔记

组合计数学习笔记

组合数

\({n\choose m}\) 表示在 \(n\) 个不同的数中选 \(m\) 个的方案数。

递推式:枚举最后一个数选还是不选 \({n\choose m}={n-1\choose m}+{n-1\choose m-1}\)

通项公式: \({n\choose m}=\frac{n!}{(n-m)!m!}\)

隔板法:

  • \(n\) 个相同的球放到允许空的 \(m\) 个不同的盒子的方案数是 \({n+m-1\choose m-1}\)
  • \(n\) 个相同的球放到非空的 \(m\) 个不同的盒子的方案数是 \({n-1\choose m-1}\)

组合恒等式

\(n\) 个数里面选 \(m\) 个和选 \(n-m\) 个本质相同, \({n\choose m}={n\choose n-m}\)

\(n\) 个数里面选任意多个可以用二进制表示,一一对应, \(\sum_{i=0}^n{n\choose i}=2^n\)

\(\sum_{i=0}^n2^i{n\choose i}=3^n\)\(3^n\) 表示有 \(n\) 个数,每个数 \(0\sim 2\) 的方案数,也可以先从 \(n\) 个中选出 \(i\) 个数然后规定这些数大于 \(0\) ,然后每个数有两个选择 \(1\) 或者 \(2\) ,所以乘以一个 \(2^i\) ,这两种方法等价。

由上面两条启发可以得出一条“套娃定理”:

\[\sum_{a_1=0}^n\sum_{a_2=0}^{a_1}\cdots\sum_{a_k=0}^{a_{k-1}}{a_{k-1}\choose a_k}\cdots{a_1\choose a_2}{n\choose a_1}=\sum_{a_0+a_1+\cdots+a_k=n}{n\choose a_0,a_1,\dots,a_k}=(k+1)^n \]

\(\sum_{i=0}^n(-1)^i{n\choose i}=[n=0]\) ,首先显然有 \(\sum_{i=0}^0(-1)^i{n\choose i}=1\) ,然后 \(\sum_{i=0}^n(-1)^i{n\choose i}=\sum_{i=0}^n(-1)^i({n-1\choose i-1}+{n-1\choose i})=\sum_{i=-1}^{n-1}(-1)^{i+1}{n-1\choose i}+\sum_{i=0}^n(-1)^i{n-1\choose i}=0(n\ge 1)\)

\(\sum_{i=0}^n{n\choose i}[2\mid i]=\sum_{i=0}^n{n\choose i}[2\not\mid i]=2^{n-1}(n\ge 1)\) ,这个式子等价于 \(\sum_{i=0}^n(-1)^i{n\choose i}=0(n\ge 1)\)

\(\sum_{i=0}^m{n+i\choose n}\) 相当于是将 \(\le m\) 个相同的球放到允许空的 \(n+1\) 个不同的盒子里去的方案数,也可以认为是多加一个盒子变成 \(n+2\) 个盒子,最后一个盒子作为“垃圾桶”,然后在这些盒子中放 \(m\) 个相同的球,确定方案后把最后的盒子和里面的球都丢掉,这样和上面一一对应,方案数是 \({n+m+1\choose n+1}\) ,所以 \(\sum_{i=0}^m{n+i\choose n}={n+m+1\choose n+1}\)

\(\sum_{i=m}^n{i\choose m}=\sum_{i=0}^{n-m}{m+i\choose m}={n+1\choose n-m}={n+1\choose m+1}\)

\(n\) 个里面选 \(m\) 个再从 \(m\) 个里面选 \(k\) 个和先在 \(n\) 个里面选 \(k\) 个再在剩下的 \(n-k\) 个里面选 \(m-k\) 个等价, \({n\choose m}{m\choose k}={n\choose k}{n-k\choose m-k}\)

\(\sum_{i=0}^k{n\choose i}{m\choose k-i}={n+m\choose k}\)\(n+m\) 中选 \(k\) 个和先把 \(n+m\) 分成两份 \(n\)\(m\) ,然后枚举左边选多少个右边选多少个等价。

\(\sum_{i=0}^n{n\choose i}^2=\sum_{i=0}^n{n\choose i}{n\choose n-i}={2n\choose n}\)

二项式反演

二项式反演的式子:

\[g(n)=\sum_{i=0}^n{n\choose i}f(i)\Leftrightarrow f(n)=\sum_{i=0}^n(-1)^{n-i}{n\choose i}g(i) \]

证明:

\[\sum_{i=0}^n(-1)^{n-i}{n\choose i}g(i) \]

\[=\sum_{i=0}^n(-1)^{n-i}{n\choose i}\sum_{j=0}^i{i\choose j}f(j) \]

\[=\sum_{j=0}^nf(j)\sum_{i=0}^n(-1)^{n-i}{n\choose i}{i\choose j} \]

\[=\sum_{j=0}^nf(j)(-1)^{n-j}\sum_{i=0}^n(-1)^{i-j}{n\choose j}{n-j\choose i-j} \]

\[=\sum_{j=0}^n(-1)^{n-j}{n\choose j}f(j)\sum_{i=0}^{n-j}(-1)^i{n-j\choose i} \]

\[=\sum_{j=0}^n(-1)^{n-j}{n\choose j}f(j)[n=j] \]

\[=f(n) \]

求组合数

\({n\choose m}\bmod p\)

\(1\le n,m\le 5000\)

直接 \(\mathcal O(nm)\) 递推即可。

\(1\le n,m\le 10^6,p\text{ is a prime number}\)

\(\mathcal O(n)\) 线性递推求逆元,然后根据通项公式 \(\frac{n!}{m!(n-m)!}\) 即可得出答案。

\(1\le n,m\le 10^{18},1\le p\le 10^6,p\text{ is a prime number}\)

Lucas 定理:

\[{n\choose m}\pmod p={n\bmod p\choose m\bmod p}{\lfloor n/p\rfloor\choose \lfloor m/p\rfloor}\pmod p \]

\(1\le n,m\le 10^{18},1\le p\le 10^6,p=p_0^c,p_0\text{ is a prime number}\)

扩展 Lucas 定理,其实和 Lucas 定理没有什么关系。

考虑把 \(n!\) 中所有 \(p_0\) 这个因数提出来,因为提出来之后就可以求逆元了,因数个数还是很好求的,就是 \(\sum_{i=1}\lfloor\frac{n}{p_0^i}\rfloor\) ,问题就是把因数提出来之后剩下的值乘起来是多少。

先考虑 \(1\sim n\) 中不是 \(p_0\) 的倍数的数,这时我们可以分别统计在模 \(p\) 意义下值为 \(i(0<i< p,i\not\mid p_0)\) 的有多少,这个很简单算,就是 \(\lfloor\frac{n}{p}\rfloor+[n\bmod p\ge i]\) ,然后全部乘起来即可。

再考虑 \(1\sim n\) 中是 \(p_0\) 的倍数的数,这样的数的数量是 \(\lfloor\frac{n}{p_0}\rfloor\) ,给所有数提出一个因子 \(p_0\) ,于是答案就变成 \(p_0^{\lfloor\frac{n}{p_0}\rfloor}\) 乘以一个将 \(\lfloor\frac{n}{p_0}\rfloor!\) 中所有 \(p_0\) 这个因数提出来之后的值了,直接递归下去求解即可。

\(1\le n,m\le 10^{18},1\le p\le 10^6\)

众所周知,有个东西叫做 CRT (中国剩余定理),然后就是扩展 Lucas 了。

\(1\le n,m\le 10^{9},1\le p\le 10^{18},p=p_0^c,p_0\text{ is a prime number},c\le 20,p_0\le 60\)

介绍一个复杂度很诡异的算法,复杂度貌似是 \(\mathcal O(c^2\log_2^3n+cp_0\log_2^2n)\) 的。。。

和扩展 Lucas 一样的思路,考虑求 \(n!\) 中的所有 \(p_0\) 这个因子提出来之后的值,先计算不含 \(p_0\) 这个因子的所有值的乘积,设:

\[f_n(x)=\prod_{i=1,i\not\mid p_0}^n(x+i) \]

那么我们要求的就是 \(f_n(x)\) 的常数项,使用倍增,设 \(n=2p_0t+s\) ,那么最后暴力乘上后 \(s\) 项,先考虑前 \(2p_0t\) 项,假如我们已经求出了 \(f_{p_0t}(x)=\sum_{i=0}a_{p_0t,i}x^i\) ,那么:

\[f_{p_0t}(x+p_0t)=\sum_{i=0}a_{p_0t,i}(x+p_ot)^i \]

\[=\sum_{i=0}a_{p_0t,i}\sum_{j=0}^ix^j(p_0t)^{i-j}{i\choose j} \]

\[=\sum_{j=0}x^j\sum_{i=j}a_{p_0t,i}(p_0t)^{i-j}{i\choose j} \]

注意,我们要求的仅仅是 \(f_n(x)\) 的常数项,考虑到 \(\sum_{i=j}a_{p_0t,i}(p_0t)^{i-j}{i\choose j}\) 中当 \(i-j\ge c\) 时就变成了 \(0\) ,所以第一次递归下去的时候我们只需要保留 \(a_{p_0t,0\sim c-1}\) 这前 \(c\) 项就可以求答案了,第二次递归下去的时候我们需要保留 \(2c\) 项就可以求出前 \(c\) 项的系数,第三次递归求出保留 \(3c\) 项……每次计算的时候都是暴力做多项式乘法,还需要多乘上一些余项,第 \(i\) 层的时间复杂度是 \(\mathcal O((ic)^2+icp_0)\) 的,最多递归 \(\log_2n\) 层,所以复杂度是 \(\mathcal {O(\sum_{i=1}^{\log_2n}((ic)^2+icp_0))=O(c^2\log_2^3n+cp_0\log_2^2n)}\)

\(1\le n,m\le 2\times 10^{9},1\le p\le 2\times 10^9,p\text{ is a prime number}\)

众所周知,有一个叫做快速阶乘算法的东西。。。时间复杂度是 \(\mathcal O(\sqrt{n}\log_2n)\) ,这里就不介绍了,因为我不会。。。

斯特林数

一些记法:

  • 上升幂记作 \(x^{\overline{n}}=\prod_{i=0}^{n-1}(x+i)\)
  • 下降幂记作 \(x^{\underline{n}}=\prod_{i=0}^{n-1}(x-i)\)

不妨规定 \(x^{\overline{0}}=x^{\underline{0}}=1\)

第一类斯特林数

这里考虑无符号第一类斯特林数。

\({n\brack m}\) 定义为将 \(n\) 个不同的数分成 \(m\) 个圆排列(循环)的方案数。

\({n\brack m}\) 也是大小为 \(n\) 且循环数量为 \(m\) 的置换数。

递推式:枚举最后一个数的放法(单独成一个圆排列或者放到之前某个数的左边)可以得到 \({n\brack m}={n-1\brack m-1}+(n-1){n-1\brack m}\) ;枚举最后一个圆排列大小可以得到 \({n\brack m}=\sum_{i=1}^n{n-i\brack m-1}(i-1)!{n-1 \choose i-1}\)

将上升幂展开得到的系数为第一类斯特林数: \(x^{\overline{n}}=\sum_{i=0}^n{n\brack i}x^i\)

考虑到 \([m]x^{\overline{n}}=[m]x^{\overline{n-1}}(x+n-1)=[m-1]x^{\overline{n-1}}+(n-1)[m]x^{\overline{n-1}}\) ,所以上升幂的递推式和第一类斯特林数相同,初值也相同,所以展开系数就是第一类斯特林数。

第二类斯特林数

\({n\brace m}\) 定义为将 \(n\) 个不同的数分成 \(m\) 个集合的方案数( \(n\) 个不同的球放到 \(m\) 个相同的盒子)。

递推式:枚举最后一个数的放法(单独成一个集合或者放到之前的某个集合中)可以得到 \({n\brace m}={n-1\brace m-1}+m{n-1\brace m}\) ;枚举最后一个集合的大小可以得到 \({n\brace m}=\sum_{i=1}^n{n-i\brace m-1}{n-1\choose i-1}\)

一个恒等式: \(n^m=\sum_{i=0}^n{n\choose i}{m\brace i}i!\) 。使用组合意义证明, \(n^m\) 是将 \(m\) 个不同的球放到 \(n\) 个不同的盒子的方案数, \(\sum_{i=0}^n{n\choose i}{m\brace i}i!\) 也表示将 \(m\) 个不同的球放到 \(n\) 个不同的盒子的方案数:首先枚举有 \(i\) 盒子非空,然后从 \(n\) 个盒子选出 \(i\) 个盒子,然后将 \(m\) 个不同的球放到 \(i\) 个相同的盒子里去,然后再乘上 \(i!\) 变成 \(i\) 个不同的盒子。

由于 \(n^m=\sum_{i=0}^n{n\choose i}{m\brace i}i!=\sum_{i=0}^m{n\choose i}{m\brace i}i!\) ,所以我们可以得到: \(x^n=\sum_{i=0}^n{n\brace i}{x\choose i}i!=\sum_{i=0}^n{n\brace i}\frac{x!}{i!(x-i)!}i!=\sum_{i=0}^n{n\brace i}x^{\underline{i}}\)

两类斯特林数


考虑以下两个式子:

\[x^{\overline{n}}=\sum_{i=0}^n{n\brack i}x^i \]

\[x^n=\sum_{i=0}^n{n\brace i}x^{\underline{i}} \]

这两个式子可以进一步扩展:

\[x^{\underline{n}}=\sum_{i=0}^n(-1)^{n-i}{n\brack i}x^i \]

\[x^n=\sum_{i=0}^n(-1)^{n-i}{n\brace i}x^{\overline{i}} \]

证明一下,先要知道这两个式子:

\[(-x)^{\underline{n}}=(-1)^nx^{\overline{n}} \]

\[(-x)^{\overline{n}}=(-1)^nx^{\underline{n}} \]

这两个式子还是比较显然的,在草稿本上列一下就可以发现了,由此我们可以得到:

\[(-1)^nx^{\underline{n}}=(-x)^{\overline{n}}=\sum_{i=0}^n{n\brack i}(-x)^i=\sum_{i=0}^n(-1)^i{n\brack i}x^i \]

\[x^{\underline{n}}=\sum_{i=0}^n(-1)^{n-i}{n\brack i}x^i \]

另一个式子:

\[(-x)^n=\sum_{i=0}^n{n\brace i}(-x)^{\underline{i}}=\sum_{i=0}^n(-1)^i{n\brace i}x^{\overline{i}} \]

\[x^n=\sum_{i=0}^n(-1)^{n-i}{n\brace i}x^{\overline{i}} \]


考虑以下两个式子:

\[x^n=\sum_{i=0}^n{n\brace i}x^{\underline{i}} \]

\[x^{\underline{n}}=\sum_{i=0}^n(-1)^{n-i}{n\brack i}x^i \]

把第二个式子代入第一个式子:

\[x^n=\sum_{i=0}^n{n\brace i}\sum_{j=0}^i(-1)^{i-j}{i\brack j}x^j=\sum_{j=0}^nx^j\sum_{i=j}^n(-1)^{i-j}{n\brace i}{i\brack j} \]

考虑左边的多项式中只有 \(x^n\) 的系数不为 \(0\) ,所以我们可以得到:

\[\sum_{i=j}^n(-1)^{i-j}{n\brace i}{i\brack j}=[j=n] \]

类似地,考虑以下两个式子:

\[x^{\overline{n}}=\sum_{i=0}^n{n\brack i}x^i \]

\[x^n=\sum_{i=0}^n(-1)^{n-i}{n\brace i}x^{\overline{i}} \]

第二个代入第一个:

\[x^{\overline{n}}=\sum_{i=0}^n{n\brack i}\sum_{j=0}^i(-1)^{i-j}{i\brace j}x^{\overline{j}}=\sum_{j=0}^nx^{\overline{j}}\sum_{i=j}^n(-1)^{i-j}{}{n\brack i}{i\brace j} \]

考虑左边的上升幂中只有 \(x^{\overline{n}}\) 的系数不为 \(0\) ,所以我们可以得到:

\[\sum_{i=j}^n(-1)^{i-j}{n\brack i}{i\brace j}=[j=n] \]

在这两个式子(这两个式子也被称为反转公式)中:

\[\sum_{i=j}^n(-1)^{i-j}{n\brace i}{i\brack j}=[j=n] \]

\[\sum_{i=j}^n(-1)^{i-j}{n\brack i}{i\brace j}=[j=n] \]

\(j=1\) ,可以得到:

\[\sum_{i=1}^n(-1)^{i-1}{n\brace i}(i-1)!=[n=1] \]

\[\sum_{i=1}^n(-1)^{i-1}{n\brack i}=[n=1] \]

这两个式子据说比较常用?


有没有觉得之前的式子都挺有对称美?再介绍两个这样优美的式子:

\[\sum_{i=0}^n{n\choose i}{i\brace m}={n+1\brace m+1} \]

\[\sum_{i=0}^n{n\brack i}{i\choose m}={n+1\brack m+1} \]

第一个式子和前面讲的递推式 \({n\brace m}=\sum_{i=1}^n{n-i\brace m-1}{n-1\choose i-1}\) 等价,当然也可以用添加一个“垃圾桶”来理解。

第二个式子可以理解为枚举 \(i\) ,然后把 \(n\) 分成 \(i\) 个循环,然后再在 \(i\) 个循环中选出 \(m\) 个循环。不妨把 \(i\) 个循环中选出来的 \(m\) 个保留,其它的循环和一个额外加入的数 \(n+1\) 一起放到一个循环中构成 \(m+1\) 个循环。

为什么这样是一一对应的?不妨认为一个循环中最大的数是这个循环的“标志”,那么把其他的循环和一个额外加入的数 \(n+1\) 一起放到一起就是首先将所有循环按“标志”从小到大排序,然后将所有循环从“标志”前断开再依次接到 \(n+1\) 后面,最后再连起来,这样我们就得到了一个新的循环;从新的循环变成若干个循环就是从 \(n+1\) 前断开变成一个序列,然后从左到右把所有数加入单调递增的单调栈中,最后单调栈中剩下的所有元素就是原先每个循环的“标志”,再从“标志”前断开整个序列,再拼接回去,就得到了原先的若干个循环。由此,这样子做是一一对应的。

难理解是吗?多读几遍就理解了,如果还是理解不了就记结论吧。


斯特林反演

斯特林反演的式子:

\[g(n)=\sum_{i=0}^n{n\brack i}f(i)\Leftrightarrow f(n)=\sum_{i=0}^n(-1)^{n-i}{n\brace i}g(i) \]

\[g(n)=\sum_{i=0}^n{n\brace i}f(i)\Leftrightarrow f(n)=\sum_{i=0}^n(-1)^{n-i}{n\brack i}g(i) \]

证明:

第一个式子~~~

\[\sum_{i=0}^n(-1)^{n-i}{n\brace i}g(i) \]

\[=\sum_{i=0}^n(-1)^{n-i}{n\brace i}\sum_{j=0}^i{i\brack j}f(j) \]

\[=\sum_{j=0}^n(-1)^{n-j}f(j)\sum_{i=j}^n(-1)^{i-j}{n\brace i}{i\brack j} \]

\[=\sum_{j=0}^n(-1)^{n-j}f(j)[j=n] \]

\[=f(n) \]

第二个式子~~~

\[\sum_{i=0}^n(-1)^{n-i}{n\brack i}g(i) \]

\[=\sum_{i=0}^n(-1)^{n-i}{n\brack i}\sum_{j=0}^i{i\brace j}f(j) \]

\[=\sum_{j=0}^n(-1)^{n-j}f(j)\sum_{i=j}^{n}(-1)^{i-j}{n\brack i}{i\brace j} \]

\[=\sum_{j=0}^n(-1)^{n-j}f(j)[j=n] \]

\[=f(n) \]

求斯特林数

第一类斯特林数


如何求 \({n\brack i}(0\le i\le m)\)

用这个式子来求:

\[x^{\overline{n}}=\sum_{i=0}^n{n\brack i}x^i \]

\(x^{\overline{n}}\) 展开即可得到 \({n\brack i}\) ,使用倍增展开,设 \(f_n(x)=\sum_{i=0}^na_{n,i}x^i\) ,那么有:

\[f_{n}(x+n)=\sum_{i=0}^na_{n,i}(x+n)^i \]

\[=\sum_{i=0}^na_{n,i}\sum_{j=0}^i{i\choose j}x^jn^{i-j} \]

\[=\sum_{j=0}^nx^j\sum_{i=j}^na_{n,i}{i\choose j}n^{i-j} \]

一次卷积可以从 \(f_n(x)\) 得到 \(f_n(x+n)\) ,而 \(f_{2n}(x)=f_n(x)f_n(x+n)\) ,再做一次卷积可以得到 \(f_{2n}(x)\) ,由此倍增求,时间复杂度是 \(\mathcal O(n\log_2n)\) 的。


如何求 \({i\brack n}(0\le i\le m)\)

感觉这个好像不太好求,不妨考虑使用生成函数,这个式子的组合意义是求 \(0\sim m\) 中每个数分成 \(n\) 个圆排列的方案数,注意到这些排列是没有区别的,不妨先乘上个 \(n!\) 变成有序的,构造 \(n=1\) 时的 EGF :

\[F(x)=\sum_{i=1}^{\infty}\frac{(i-1)!}{i!}x^i=\sum_{i=1}^{\infty}\frac{1}{i}x^i=\ln(\frac{1}{1-x}) \]

大小为 \(i\) 的圆排列给答案贡献时要先乘以一个 \((i-1)!\) ,所以要求的就是:

\[[x^i]\frac{F^n(x)}{n!}=[x^i]\frac{\ln^n(\frac{1}{1-x})}{n!}(0\le i\le m) \]

多项式快速幂做到 \(\mathcal O(n\log_2n)\)


第二类斯特林数


如何求 \({n\brace i}(0\le i\le m)\)

考虑这个式子:

\[m^n=\sum_{i=0}^m{m\choose i}{n\brace i}i! \]

二项式反演得到:

\[{n\brace m}m!=\sum_{i=0}^m(-1)^{m-i}{m\choose i}i^n \]

\[{n\brace m}=\frac{1}{m!}\sum_{i=0}^m(-1)^{m-i}{m\choose i}i^n \]

一次卷积即可做到 \(\mathcal O(n\log_2n)\)


如何求 \({i\brace n}(0\le i\le m)\)

这个也不太好求,再使用一次生成函数,这个式子的组合意义是求 \(0\sim m\) 中每个数分成 \(n\) 个集合的方案数,这些集合也是没有区别的,所以先乘上 \(n!\) 变成有序,构造 \(n=1\) 时的 EGF :

\[F(x)=\sum_{i=1}^{\infty}\frac{1}{i!}x^i=e^x-1 \]

大小为 \(i\) 的集合对答案贡献时要乘上 \(1\) ,所以要求的就是:

\[[x^i]\frac{F^n(x)}{n!}=[x^i]\frac{(e^x-1)^n}{n!}(0\le i\le m) \]

多项式快速幂做到 \(\mathcal O(n\log_2n)\)


十二重计数法

题目链接

来做一点组合计数的基础练练手吧!

  • \(n\) 个无标号小球( U )/有标号小球( L )。
  • \(m\) 个无标号盒子( U )/有标号盒子( L )。
  • 放法无限制( A )/每个盒子至少放一个小球( B )/每个盒子至多放一个小球( C )。

L 表示 labeled , U 表示 unlabeled 。

\(1\le n,m\le 10^5\)

UUA

小球无标号,盒子无标号,放法无限制。

答案就是把 \(n\) 分成 \(m\) 个非负整数之和的方案数,可以用 dp 做,设 \(p_{n,m}\) 表示把 \(n\) 分成 \(m\) 个非负整数之和的方案数,第一种情况是所有数大于 \(0\) ,第二种情况是存在一个数等于 \(0\) ,可以写出以下转移方程:

\[p_{n,m}=p_{n-m,m}+p_{n,m-1} \]

当然也可以枚举最小值是多少,可以写出以下转移方程:

\[p_{n,m}=\sum_{i=0}p_{n-mi,m-1} \]

可以发现这其实就是一个完全背包,第 \(m\) 个物品大小为 \(m\) ,背包容量是 \(n\) ,于是问题就变成了付公主的背包(求恰好放满的方案数)。

讲一下付公主的背包是如何实现的,不妨设背包容量为 \(m\) ,物品数量为 \(n\) ,第 \(i\) 个物品大小为 \(v_i\)

首先,大小为 \(v\) 的物品的生成函数为:

\[F_v(x)=\sum_{i=0}^{\infty}x^{vi}=\frac{1}{1-x^v} \]

答案就是:

\[[x^m]\prod_{t=1}^nF_{v_t}(x) \]

积不好算,考虑取 \(\ln\) 之后变成求和:

\[[x^m]\prod_{t=1}^nF_{v_t}(x)=[x^m]e^{\sum_{t=1}^n\ln(F_{v_t}(x))} \]

如何求 \(\ln(F_v(x))\) ?不妨设 \(P(x)=\ln(F_v(x))=\ln(\frac{1}{1-x^v})=-\ln(1-x^v)\) ,两边同时求导得到:

\[P'(x)=-(\ln(1-x^v))' \]

链式法则: \((f(g(x)))'=f'(g(x))g'(x)\)\(\ln'(x)=\frac{1}{x}\) 。由此可以得到:

\[P'(x)=-\frac{1}{1-x^v}(-vx^{v-1})=\frac{vx^{v-1}}{1-x^v}=vx^{v-1}\sum_{i=0}^{\infty}x^{vi}=\sum_{i=1}^{\infty}vx^{vi-1} \]

积回去:

\[P(x)=\sum_{i=1}^{\infty}\frac{x^{vi}}{i} \]

所以有:

\[\ln(F_v(x))=\sum_{i=1}^{\infty}\frac{x^{vi}}{i} \]

记录大小为 \(v\) 的物品数量,然后一次 \(\mathcal O(m\log_2m)\) 得出 \(\sum_{t=1}^n\ln(F_{v_t}(x))\) ,再 \(\exp\) 回去就行了。

UUB

小球无标号,盒子无标号,每个盒子至少放一个小球。

答案就是划分数,就是把 \(n\) 分成 \(m\) 个正数之和的方案数,考虑每个数减 \(1\) 之后就是非负数了,所以答案就是 \(n-m\) 分成 \(m\) 个非负整数之和的方案数,也就是 UUA 。

UUC

小球无标号,盒子无标号,每个盒子至多放一个小球。

每个盒子只有两种情况,放或者不放,又盒子无标号,所以盒子放的数量就是 \(n\) ,只有在 \(m\ge n\) 的时候才可以有方案,所以答案就是 \([m\ge n]\)

ULA

小球无标号,盒子有标号,盒子无限制。

隔板法,将 \(n\) 个相同的球放到允许空的 \(m\) 个不同的盒子:

\[{n+m-1\choose m-1} \]

ULB

小球无标号,盒子有标号,每个盒子至少放一个小球。

隔板法,将 \(n\) 个相同的球放到非空的 \(m\) 个不同的盒子:

\[{n-1\choose m-1} \]

ULC

小球无标号,盒子有标号,每个盒子至多放一个小球。

\(m\) 个盒子中选 \(n\) 来放小球:

\[{m\choose n} \]

LUA

小球有标号,盒子无标号,盒子无限制。

\(n\) 个数分成 \(m\) 个可空集合,枚举多少个集合非空:

\[\sum_{i=0}^m{n\brace i} \]

LUB

小球有标号,盒子无标号,每个盒子至少放一个小球。

\(n\) 个数分成 \(m\) 个非空集合,就是第二类斯特林数的定义:

\[{n\brace m} \]

LUC

小球有标号,盒子无标号,每个盒子至多放一个小球。

盒子无标号,每个盒子要么放要么不放,并且放进去的小球就是 \(1\sim n\) ,方案数:

\[[m\ge n] \]

LLA

小球有标号,盒子有标号,盒子无限制。

每个小球 \(m\) 种选择, \(n\) 个小球,乘法原理:

\[m^n \]

LLB

小球有标号,盒子有标号,每个盒子至少放一个小球。

先假设盒子无标号,那么就是 LUB ,再乘上 \(m!\) 就行了:

\[{n\brace m}m! \]

LLC

小球有标号,盒子有标号,每个盒子至多放一个小球。

选出哪些盒子放,再把小球放进去就行了:

\[{m\choose n}n! \]

或者第一个小球 \(m\) 个选择,第二个小球 \(m-1\) 个选择……:

\[m^{\underline{n}} \]

posted @ 2020-10-06 22:10  xiaolilsq  阅读(445)  评论(1编辑  收藏  举报