为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。
Sgu/476
来自NOCOW
< Sgu
这道题是说一个教练,有3*N个学生,要把他们3个3个分成N组,同时有k个3元组的学生不能成为一组,有多少种方法。 由于N<=1000,k<=20。。我的办法是利用容斥原理来做,枚举每移一种k个3元组的子集,然后分别计算各种方法数。。就可以了。。 具体可以看容斥原理的介绍(*^__^*) 但是这样是要TLE的。。我发现不用每一个算出来都加一下。。由于实际上+的值只有k+1种,弄一个add数组表示每种情况被+的次数。。到最后乘一下就可以了。。
不考虑有不能组合的情况,有3n个人的话,方案总数为 (3n)!/(n!*6^n) 因为我们可以看为是3n的全排列,每3个插一块板。 每两块板之间的3个数字有6种排列,这些是相同的。 还有每两块板中间的小团体,是可以和其他小团体交换位置的,有n!个情况 所谓方案总数为(3n)!/(n!*6^n)
有n=3,k=1的情况下,显然就有一种情况无法取得
比如不能出现[xyz]的情况
那么[xyz][???][???]这些都不可行,这些方案有多少种呢?
其实就是[???][???]的方案总数,因为[xyz]被确定了,不需要考虑。
而[???][???]就是上述公式中n=2的情况。
虽然一共有2^m种组合,但是容斥时候要用到的数字只有不超过1000个。(n的取值范围为1..1000嘛)
我们只需要知道每一个情况下数字的使用数量,最后把这一坨数字加起来就行了。
还有(3n)!/(n!*6^n)公式前后之间有很明显递推关系。
PS:别忘记了坑爹的高精度,记得压位,否则很慢(也能过)