对大牛来说应该是个水题,然而对我这数学弱鸟就不同了,所以还是有必要记一下。顺便整理一下刚刚看的一些东东。
题目大意是,给定N个可区分的盒子,把A个红球和B个蓝球放到这些盒子里,问有多少种情况。同颜色的球不可区分,球可以不放进任何一个盒子。(1<=N<=20, 0<=A,B<=15) 比如有2个盒子,然后1个红球1个蓝球,那么答案是9。
首先容易发现,两种颜色之间是不会相互影响的。所以只要分别求出A个球和B个球有多少种放法,把结果相乘即可。球可以不放进任何一个盒子这一点比较讨厌,可以通过枚举的方法搞掉它。枚举0..A个球放入N个盒子各有多少种方法,然后把结果相加。
现在的问题剩下了:把a个不可区分的球放入N个可以区分的盒子,每个球必须放入某个盒子里,盒子可以为空。这里有一个很巧妙的转化我没有想到,然而据wtommy说是高中就讲过的-,-。首先如果盒子不能为空的话问题就简单了,可以想象成在排成一排的球中间放隔板,一共有a-1个位子,要放n-1个板,所以是C(a-1,n-1)。然而现在隔板中间可以没有球,转化一下,在每个盒子里面先加入一个球,于是就回到了前面的问题,所以结果是C(a+n-1,n-1) = C(a+n-1,a)。
上面的方法需要太多的技巧,下面说一下用生成函数的方法。
对于每个盒子,我们可以不放入球,放入1个,放入2个……于是得到 1+x+x^2+...
共有N个盒子,因此生成函数为
(1+x+x^2+...)^n
= (1/(1-x))^n = (1+(-x))^(-n)
= sigma(C(-n,r) * (-x)^r) (for all r >= 0) (二项式定理)
= sigma(C(n+r-1,r) * x^r) (for all r >= 0) (转化成一般的组合数形式)
于是可以直接得到x^a的系数C(n+a-1,a)即为所求。
这样求出来的式子并不简练,实际上把最后那个所有数的求和化简一下可以得到
C(n-1,n-1) + C(n,n-1) + C(n+1,n-1) + ... + C(n+a-1,n-1)
= C(n-1,n) + C(n-1,n-1) + C(n,n-1) + C(n+1,n-1) + ... + C(n+a-1,n-1)
= C(n,n) + C(n,n-1) + C(n+1,n-1) + ... + C(n+a-1,n-1)
= C(n+1,n) + C(n+1,n-1) + ... + C(n+a-1,n-1)
= ...
= C(n+a,n)
于是最终答案为 C(N+A,N) * C(N+B,N)
ps. 这个最后形式实在是太简单了,以至于我总感觉有什么更巧妙的转化可以直接得到这个结果,还望路过的大牛赐教……


