P5216 DLS 采花

Posted on 2025-04-18 23:18  K_J_M  阅读(24)  评论(0)    收藏  举报

题目描述

DLS 有 \(N\) 个花田,每个花田里有 \(a_i\) 朵花。

DLS 喜欢稀奇古怪的花田,他希望重新排列花田,然后去采花。
但 DLS 采花又有一个癖好:他会从左往右采花。
若当前采到第 \(i\) 个花田,在之前有一个花田的花的数量,是第 \(i\) 个花田的花的数量的因子的话,那么 DLS 不会采这个花田的花。

现在,DLS 想知道对于所有排列花田的方案,他能够采到的花的数量的和是多少。
由于答案会比较大,请对 \(998244353\) 取模。

Solution

考虑计算每一个数的贡献。

首先对于每一个数 \(a_i\) 计算出它有多少个因子是原序列中的数,记个数为 \(n_i\)

现在有一个 80pts 做法,首先枚举每一个数 \(a_i\),在枚举它放在 \(j\) 为位置上的贡献。此时它要有贡献,那么它的前 \(j-1\) 个位置上都没有它的因子,也就是让 \(n-1-n_i\) 个不是 \(a_i\) 因子的数填满 \(1\sim j-1\) 之后再随便排列就行了。

总贡献为:

\[\sum_{i=1}^{n}\sum_{j=1}^{n-n_i}A_{n-1-n_i}^{j-1}\times (n-j)!\times a_i \]

时间复杂度为 \(\mathcal O(n^2)\)

下面来讲正解。

我们可以将 \(a_i\) 和它的 \(n_i\) 个因子看成一个整体,我们只需要在这个 \(1+n_i\) 长度的序列中让 \(a_i\) 放第一位,然后其它因子随便排即可。此时我们的总贡献为:

\[\sum_{i=1}^{n}{n \choose n_i+1}\times n_i!\times (n-1-n_i)! \]

时间复杂度 \(\mathcal O(n)\)
Ac Code