Dp。
先考虑第一个条件,不考虑第二个条件。
对于每一层,设g[i][j] 为 到第i个位置,用j种颜色的方案数 ,颜色编号递增。
g[i][j] = g[i - 1][j - 1] + g[i - 1][j] * (j - 1)
对于i这个位置,我们能开出一种新的颜色(j),也能不开出一种,用前面就有的j种,但是不能和i - 1位置的颜色相同,所以减一。
然后再设f[i][j]为前i层其中第i层用了j种颜色的方案数。
前面理解起来容易,最重要是减去的部分(考虑了第二种限制)
在计算fi - 1, k 时候, 当k = j的时候,才有颜色集合相同的情况。
后面减去的项我们可以这么考虑:
不考虑顺序问题, 先忽略j!
根据乘法原理,左边f的每一个方案我们列开,g的每个可以得到j个颜色的方案也列开。
对于左边的方案,可以根据选择的是哪j种颜色将它们划分为(m, j)个集合,同集合内的每个点贡献方式相同。
考虑左边的一个集合,它对应的是一种选色的方案,与右边的g的方案配对,对于每个可以得到j个颜色的方案,有且只有一种选色方式能让左右最终选得的颜色集合相同,即和我们选定集合的选色方式一样。