1 条题解
-
-13
Case 1:
考虑枚举每一个数出现了多少次,然后简单计算众数和概率即可。
Case 2:
也许存在一些 做法,但是出题人没有想到啥好的实现。
Case 3:
这一档是留给一些实现比较差的正解,或者一些奇奇怪怪没有跑过的多项式做法。
一句题外话,这道题出题人只想到了一个 的做法,感觉没有啥意思。但是还是非常良心的把模数设成了 , 如果选手有非常美妙的多项式做法也可以分享一下。
同时发现,这道题的 其实是不重要的,在 很小的时候也许在某些地方可以减少一些代码实现,但这都是平凡的。
Case 4:
考虑正解,首先我们考虑描述众数的方式:,其中 是 在序列中的出现次数。
于是我们考虑 容斥,,尝试计算 $\sum_{S \subseteq U,S \neq \emptyset} (-1)^{|S|-1} \min_{j \in S} f_j$.
更进一步的观察,我们只关心 ,也就是 的大小,换句话说,也就是序列里出现数的种类数。
假设序列里出现了 个数,并且出现次数分别是 ,贡献的系数就是 $(-1)^{k-1} \binom{m}{k} k! \frac{n!}{\prod a_i!} \min_i a_i$。
对于 ,我们改为对于每一个 ,计算 的方案数。
而计算 会出现一些神秘多项式做法,但是出题人在这里要介绍的是另一种做法。
考虑因为我们的条件是 ,于是我们考虑从大到小枚举一个出现次数,然后尝试用动态规划来解决问题。
设 表示考虑完了出现次数 的数,目前出现了 种数,一共有 个。
考虑转移,直接枚举一共有多少个数的出现次数为 ,然后直接转移。
考虑这份代码的时间复杂度,这里其实我们可以用一个程序计算我们需要执行的循环次数,如下:
rf(v,n,1) fr(j,0,min(n/v,m)) fr(k,j*v,n) ans+=(n-k)/v;跑完之后发现 时循环次数只有 左右,并且这个数不一定取得到,最后实际的次数一定比这个少,于是直接按照最暴力的方式转移就可以了。
然后注意一下转移的系数,推一下并不是很复杂,这一步留给选手自己计算一下。
时间复杂度 ,但是这个常数非常的小,可以通过这道题。
后面是一个多项式做法:
1. 期望转化
设随机变量 为众数的出现次数,则
因此只需对每个 计算至少有一种数出现次数不少于 的概率。
2. 容斥原理
固定 ,设事件 表示第 种数出现次数 。由容斥原理:
$$P\left(\bigcup_{i=1}^{m} A_i\right) = \sum_{t=1}^{\min(m,\lfloor n/k \rfloor)} (-1)^{t-1} \binom{m}{t} \cdot P(\text{指定的 }t\text{ 种数均} \ge k). $$3. 指定 种数均 的概率
指定 种数,记它们的总出现次数为 (显然 )。在 个独立试验中,选择 个位置给这些数,方案数为 ;将这 个位置分配给 种数,要求每种至少 个,记分配方式数为 ;剩余 个位置由其余 种数任意填充,有 种。因此满足条件的序列总数为
概率即为该总数除以 。
4. 计算
问题等价于将 个有标号球放入 个有标号盒子,每个盒子至少 个球。考虑指数生成函数:
则
- 当 时:,此时 的系数与第二类斯特林数相关,可利用递推$$f_t(s) = \frac{t}{s} \big( f_t(s-1) + f_{t-1}(s-1) \big) $$在 时间内计算所有 。
- 当 时:直接计算多项式幂次。由于 ,可预处理多项式 的前 项,然后通过快速幂(逐次卷积)得到 的前 项系数,卷积用 NTT 加速(长度取 的幂次)。对每个 进行卷积,总卷积次数约为 。
5. 整体流程
- 预处理:阶乘、逆元、组合数 ()、、 等。
- 对每个 :
- 计算所有需要的 (根据 选择方法)。
- 利用容斥公式累加得到 。
- 将所有 求和得到期望。
时间复杂度
- 当 时,递推求 复杂度 。
- 当 时,对每个 进行一次 NTT 卷积,总卷积次数约为 。单次 NTT 长度为 ,复杂度 ,因此该部分总复杂度 。
- 容斥求和部分的额外复杂度为 ,可忽略。
总时间复杂度为 ,对于 可以在时限内运行。
- 1
信息
- ID
- 12
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 219
- 已通过
- 36
- 上传者