Ice Cream Balls

先考虑如果每个冰淇淋球不相同时的情况数。设有 种不同的冰淇淋球,显然有:方案数

现在已知 ,直接求解这个关于 的方程的正数解,即

但是在大部分情况下,这个式子并不能得到一个正整数解。也就是说,冰激凌球会有重复的。想一想如何知道要有几个重复的呢?

看一下这个例子:。他能做出几种不同的冰淇淋?
这里有 ,不管选用哪个都是一样的。我们先将它们看为 个,这样就变成了 个互不相同的冰淇淋球,有 种。但是初始时的 也可以做成一种冰淇淋,因此总的方案数还要 ,即 种。

从上述过程能看出来,有几组重复的冰淇淋球,方案数 就会多几。

我们在上面讨论的只有 个相同的冰淇淋球,那么可能会出现 个或更多相同的冰淇淋球吗?
如果有 个相同的冰淇凌球,答案的贡献仍然只会 ,但是却浪费了一个冰淇凌球!这与题目要求的最小化 不符合,因此不会出现 个或更多的重复冰淇凌球。

由此我们就可以尝试推导通式了。先根据 求方程 的正数解,即 。设 。当 个冰淇凌球互不相同时,总共的方案数为 ,但是这可能不足 ,我们需要相同的冰淇凌球来补全剩下的。每多一组相同的冰淇凌球方案数会 ,我们只需要再变出 个与前面有重复的冰淇淋球即可让最终的方案数等于 。这些冰淇凌球贡献出了 种方案,早已构造出的方案数为 ,则最终答案为

稍微有些混乱,设输入为 ,这是最后的结论:

结论题应该就不用给代码了吧……

最后注意精度,建议 long double,就可以愉快通过了。

posted @ 2023-08-25 21:18  MrPython  阅读(5)  评论(0)    收藏  举报  来源