题目描述
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
浙公网安备 33010602011771号