题意可以理解为有k种数,每个都ki个,把这k个数放到n个容器里,保证这n个容器里没有空的。
设f[i]为i个容器里没有空的,g[i]为i个容器里可以为空。
则g[n] = f[n] - c(n,1)f[n-1]+c(n,2)f[n-2] - c(n,3)f[n-3];
看了好多题解,说这是用归纳法证明,我不知道怎么证明,但是可以用容斥来解释。
f[n] - c(n,1)f[n-1];这个式子减去了所有只有一个为空的情况,减去2倍两个为空的情况,3倍三个为空的情况,c(i,1)倍i个为空的情况。
对于两个为空的情况,因为其中一个已选定,那么每一对数将会被减去两次。
所有要加上c[n-2]f[n-2],这时f[n]-c(n,1)f[n-1]+c(n,2)f[n-2] 就是减去了所有一个或两个为空的情况,减去(c(i,1) - c(i,2))倍i个为空的情况,
所以对于每一个i来说它最后的次数是
c[i][0] - c[i][1]+c[i][2] ,,, = 0;//这里是排列组合的一个性质,从n个数中选取奇数个和选取偶数个的方法数相同。
所以最后结果就是全部不为空的情况。