1 条题解

  • -13
    @ 2026-4-29 12:51:06

    Case 1: n,m10n,m \leq 10

    考虑枚举每一个数出现了多少次,然后简单计算众数和概率即可。

    Case 2:m,m20m,m \leq 20

    也许存在一些 2n2^n 做法,但是出题人没有想到啥好的实现。

    Case 3:n100n \leq 100

    这一档是留给一些实现比较差的正解,或者一些奇奇怪怪没有跑过的多项式做法。

    一句题外话,这道题出题人只想到了一个 Θ(n2log2n)\Theta(n^2 \log^2 n) 的做法,感觉没有啥意思。但是还是非常良心的把模数设成了 998244353998244353, 如果选手有非常美妙的多项式做法也可以分享一下。

    同时发现,这道题的 mm 其实是不重要的,在 mm 很小的时候也许在某些地方可以减少一些代码实现,但这都是平凡的。

    Case 4:n103,m109n \leq 10^3,m \leq 10^9

    考虑正解,首先我们考虑描述众数的方式:maxifi\max_i f_i,其中 fif_iii 在序列中的出现次数。

    于是我们考虑 min_maxmin\_max 容斥,U={1,2,m}U=\{1,2, \dots m\},尝试计算 $\sum_{S \subseteq U,S \neq \emptyset} (-1)^{|S|-1} \min_{j \in S} f_j$.

    更进一步的观察,我们只关心 S|S|,也就是 SS 的大小,换句话说,也就是序列里出现数的种类数。

    假设序列里出现了 kk个数,并且出现次数分别是 a1,a2,aka_1,a_2, \dots a_k,贡献的系数就是 $(-1)^{k-1} \binom{m}{k} k! \frac{n!}{\prod a_i!} \min_i a_i$。

    对于 min\min ,我们改为对于每一个 kk,计算 min>=kmin>=k 的方案数。

    而计算 (1)k1(mk)k!n!ai!(-1)^{k-1} \binom{m}{k} k! \frac{n!}{\prod a_i!} 会出现一些神秘多项式做法,但是出题人在这里要介绍的是另一种做法。

    考虑因为我们的条件是 mink\min \geq k,于是我们考虑从大到小枚举一个出现次数,然后尝试用动态规划来解决问题。

    fv,i,jf_{v,i,j} 表示考虑完了出现次数 v\geq v 的数,目前出现了 ii 种数,一共有 jj 个。

    考虑转移,直接枚举一共有多少个数的出现次数为 vv,然后直接转移。

    考虑这份代码的时间复杂度,这里其实我们可以用一个程序计算我们需要执行的循环次数,如下:

    rf(v,n,1)
        fr(j,0,min(n/v,m))
            fr(k,j*v,n)
                ans+=(n-k)/v;
    

    跑完之后发现 n=103n=10^3 时循环次数只有 2×1082 \times 10^8 左右,并且这个数不一定取得到,最后实际的次数一定比这个少,于是直接按照最暴力的方式转移就可以了。

    然后注意一下转移的系数,推一下并不是很复杂,这一步留给选手自己计算一下。

    时间复杂度 Θ(n3)\Theta(n^3),但是这个常数非常的小,可以通过这道题。

    后面是一个多项式做法:

    1. 期望转化

    设随机变量 XX 为众数的出现次数,则

    E[X]=k=1nP(Xk).E[X] = \sum_{k=1}^{n} P(X \ge k).

    因此只需对每个 kk 计算至少有一种数出现次数不少于 kk 的概率。

    2. 容斥原理

    固定 kk,设事件 AiA_i 表示第 ii 种数出现次数 k\ge k。由容斥原理:

    $$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. 指定 tt 种数均 k\ge k 的概率

    指定 tt 种数,记它们的总出现次数为 ss(显然 stks \ge tk)。在 nn 个独立试验中,选择 ss 个位置给这些数,方案数为 (ns)\binom{n}{s};将这 ss 个位置分配给 tt 种数,要求每种至少 kk 个,记分配方式数为 ft(s)f_t(s);剩余 nsn-s 个位置由其余 mtm-t 种数任意填充,有 (mt)ns(m-t)^{n-s} 种。因此满足条件的序列总数为

    s=tkn(ns)ft(s)(mt)ns.\sum_{s=tk}^{n} \binom{n}{s} f_t(s) (m-t)^{n-s}.

    概率即为该总数除以 mnm^n

    4. 计算 ft(s)f_t(s)

    问题等价于将 ss 个有标号球放入 tt 个有标号盒子,每个盒子至少 kk 个球。考虑指数生成函数:

    A(x)=j=kxjj!,A(x) = \sum_{j=k}^{\infty} \frac{x^j}{j!},

    ft(s)=s![xs](A(x))t.f_t(s) = s! \cdot [x^s] \big(A(x)\big)^t.
    • k=1k=1A(x)=ex1A(x) = e^x - 1,此时 (A(x))t\big(A(x)\big)^t 的系数与第二类斯特林数相关,可利用递推$$f_t(s) = \frac{t}{s} \big( f_t(s-1) + f_{t-1}(s-1) \big) $$在 O(n2)O(n^2) 时间内计算所有 ft(s)f_t(s)
    • k>1k>1:直接计算多项式幂次。由于 n1000n \le 1000,可预处理多项式 A(x)A(x) 的前 n+1n+1 项,然后通过快速幂(逐次卷积)得到 A(x)tA(x)^t 的前 nn 项系数,卷积用 NTT 加速(长度取 2n2n 的幂次)。对每个 tt 进行卷积,总卷积次数约为 O(nlogn)O(n \log n)
    5. 整体流程
    1. 预处理:阶乘、逆元、组合数 (mt)\binom{m}{t}tnt \le n)、(1m)i\left(\frac{1}{m}\right)^i(mt)i(m-t)^i 等。
    2. 对每个 k=1nk = 1 \dots n
      • 计算所有需要的 ft(s)f_t(s)(根据 kk 选择方法)。
      • 利用容斥公式累加得到 P(Xk)P(X \ge k)
    3. 将所有 P(Xk)P(X \ge k) 求和得到期望。
    时间复杂度
    • k=1k=1 时,递推求 ft(s)f_t(s) 复杂度 O(n2)O(n^2)
    • k>1k>1 时,对每个 tt 进行一次 NTT 卷积,总卷积次数约为 k=2nn/k=O(nlogn)\sum_{k=2}^{n} \lfloor n/k \rfloor = O(n \log n)。单次 NTT 长度为 O(n)O(n),复杂度 O(nlogn)O(n \log n),因此该部分总复杂度 O(n2log2n)O(n^2 \log^2 n)
    • 容斥求和部分的额外复杂度为 O(n2logn)O(n^2 \log n),可忽略。

    总时间复杂度为 O(n2log2n)O(n^2 \log^2 n),对于 n1000n \le 1000 可以在时限内运行。

    • 1

    信息

    ID
    12
    时间
    2000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    219
    已通过
    36
    上传者