AtCoder Regular Contest 156
B. Mex on Blackboard
题目大意
给定 \(N\) 个元素的数组 \(A\),每次操作你可以从数组中选出任意个元素,然后向数组中加入这些元素的 \(mex\) 。
问 \(K\) 次操作后,可以得到多少种不同的数组。
思路
假如你能向数组中加入 \(x\) 且 \(x\) 是你写的最大整数,那么数组中 \(0\sim x-1\) 绝对都出现过一次。 因为如果 \(x-1\) 不存在的话加入的数会变成 \(x-1\) 。第一次写入 \(x\) 后,之后就可以加入 \(0\) 到 \(x\) 之间的任何整数。
观察到值域不大,考虑枚举最大整数 \(x\)。设你需要 \(cnt\) 次才能写下 \(x\) 这个数,那么你写下 \(x\) 这个数后就还剩 \(K-cnt\) 次操作机会,问题转化成使用 \(K-cnt\) 次操作,每次操作写下 \(0\sim x\) 任意一个数,问最后有多少个多重集合。
这不就等价于 \(n\) 个小朋友分 \(m\) 个苹果吗?(在这里 \(n=x+1\),\(m=K-cnt\))。当然不保证 \(n\) 个小朋友每个都要分至少一个苹果。排列组合经典问题,\(n\) 个小朋友分 \(m\) 个苹果 $ \ = \ $ \(n+m\) 个小朋友分 \(m\) 个苹果且每个小朋友至少一个。
则答案为 \({C(}^{\ \ \ m-1}_{n+m-1})\),在这里答案就为 \({C(}^{ \ \ \ \ \ \ \ x}_{K-cnt+x})\)。
参考代码:code