CF1716F
CF1716F
题目描述
有 \(n\) 个袋子,每个袋子里有 \(m\) 个球,球的编号从 \(1\) 到 \(m\) 。对于每个 \(i∈[1,m]\) ,每个袋子中正好有一个编号为 \(i\) 的球。
你必须从每个袋子中恰好取一个球(所有袋子都不同,例如,从第一个袋子取球 \(1\) 并从第二个袋子取球 \(2\) 与从第一个袋子取球 \(2\) 并从第二个袋子取球 \(1\) 不是同一种情况)。然后,你计算你取出的球中数字为 奇数 的球的数量。将这些球的数量记为 \(F\)。
你任务是计算从每个袋子中取出 \(n\) 个球的所有可能方式下 \(F^k\) 的总和。对 \(998244353\) 取模。
\(t\) 组数据,\(t\le 5000\) 。
\(1≤n,m≤998244352; 1≤k≤2000\)
做法:
首先可以非常显然的写出一个 \(O(tn)\) 的做法,但是显然时间复杂度是巨大的!
但注意到 \(k\le2000\) 所以时间复杂度应该是类似 \(O(tk)\) 。
由于答案是 \(\sum F^k\) ,所以肯定是有组合意义的:
先确定一个选球方案,然后有序的选取 \(k\) 个位置(可重),使得这 \(k\) 个位置上的球的编号都是奇数的方案数。
这样可以转换统计顺序:
先有序的选取 \(k\) 个位置,然后再确定一个选球方案,使得这 \(k\) 个位置上都是奇数的方案数。
如果选取的位置总共有 \(c\) 个,那么其对应选球的方案数就是:
表示这 \(c\) 个位置只能选奇数,其他任意。
所以现在的关键就变成了,求有序选取 \(k\) 个位置,使得选取的位置只有 \(c\) 个的方案数。
可以先把这 \(c\) 个位置固定下来,方案数为 \(\binom{n}{c}\)。
然后相当于是要选 \(k\) 个位置,使得选中的位置都在这 \(c\) 个位置上。
就是把 \(k\) 个位置分成 \(c\) 组的方案数乘上全排列的方案数。
前者是第二类斯特林数,可以预处理 \(O(k^2)\) 解决 。
所以有序选取 \(k\) 个位置,使得选取的位置只有 \(c\) 个的方案数为:
其中 \(S(k,c)\) 表示把 \(k\) 个位置分成 \(c\) 组的方案数(即第二类斯特林数)。
枚举 \(c\) ,累加答案即可。
时间复杂度 \(O(k^2+tk)\) 。

浙公网安备 33010602011771号