1 条题解

  • 0
    @ 2026-8-23 8:04:03

    题解

    思路推导

    序列长度为 n+1n+1,值域中只有 nn 个数,并且每个数至少出现一次,因此恰有一个数出现两次,其余数各出现一次。若忽略这两个相同元素,选择 kk 个位置共有 (n+1k)\binom{n+1}{k} 种;只需扣除会得到相同子序列的重复选择。

    做法

    设重复值的两个位置为 l<rl<r,位置从 00 开始编号。位于区间 [l,r][l,r] 外的元素数量为

    s=l+(nr).s=l+(n-r).

    两组不同的位置选择会得到同一子序列,当且仅当它们分别选择重复值的两个出现位置,而其余 k1k-1 个位置全部从区间外选取。因此长度为 kk 的重复计数为 (sk1)\binom{s}{k-1},答案为

    (n+1k)(sk1)(mod109+7).\binom{n+1}{k}-\binom{s}{k-1}\pmod{10^9+7}.

    预处理 00n+1n+1 的阶乘与逆阶乘,即可在常数时间求每个组合数并依次输出答案。

    正确性证明

    每个 kk 元位置集合都唯一确定一个长度为 kk 的子序列。由于只有一个值重复,两个不同位置集合产生相同内容时,它们的差异只能是选择了该重复值的不同出现位置。

    若还选择了两个重复位置之间的某个元素,替换重复值出现位置会改变这个元素与重复值的相对顺序,所得子序列不同。因此,重复的两种选择中,其余 k1k-1 个位置必须全部在 ll 左侧或 rr 右侧;反之,从这 ss 个外部位置任取 k1k-1 个,分别搭配两个重复位置,确实得到同一子序列。这样的重复恰有 (sk1)\binom{s}{k-1} 个。

    所以从全部 (n+1k)\binom{n+1}{k} 个位置选择中减去它们,恰好得到不同子序列数量。对每个 kk 分别计算,算法正确。

    复杂度分析

    阶乘与逆阶乘预处理、寻找重复位置以及输出答案均为 O(n)O(n);空间复杂度为 O(n)O(n)

    • 1

    信息

    ID
    976
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者