ARC096E题解

· · 题解

题目传送门

今天模拟赛考了这道题,然后保龄了。

思路

f[i] 为钦定 i 种配料出现次数小于等于 1 的方案数。

那么就有 ans=\sum_{i=0}^{n}{(-1)^{i}}{C_n^i}{f[i]}

首先枚举出现次数小于等于 1 次的配料中有几个配料出现了和有几碗面中出现了这些配料,设有 j 个配料出现在了 k 碗面中。

那么容易想到第二类斯特林数

第二类斯特林数 \operatorname{S2}(n,m) 表示的是把 n 个不同元素划分到 m 个集合的方案数。表示为 n \brace m

j 个不同元素划分到 k 个集合中,即为 k \brace j

斯特林数处理的是只能是非空集合,所以先考虑所有数都加入集合的情况,即为k \brace j ,然后考虑有数没有加入集合的情况,我们可以加入一个第 k+1 集合,把 1k 都不放元素的元素加入这个集合中,然后每个集合都可以是第 k+1 个集合,所以方案数为 {(j+1)}\times {{k+1} \brace j }

另外,这 k 种面的其他配料可以随便加而不用担心出现重复的碗,方案数即为 2^{{n-i}^{k}}

题目中说有 n 种元素,总共有 2^{n} 种集合,去掉已经钦定的 i 种元素之后,剩下 2^{n-i} 种集合。对于 i 个元素之外的 n-i 个数组成的 2^{n-i} 个集合可以选也可以不选,所以是 2^{2^{n-i}} 种方案。 这里有一个细节就是幂次的处理需要用费马小定理。

Ans=\sum_{i=0}^{n}{(-1)^i}{ \operatorname{C}_n^i}\times 2^{2^{n-i}} \sum_{j=0}^i( {i \brace j} + (j+1)\times {{j+1} \brace {i}} )\times(2^{n-i})^j

预处理出斯特林数后 O(n^2+logP) 计算即可。