1 条题解

  • 7
    @ 2026-9-29 21:06:00

    与(and)

    给定 n,kn,k ,一个长度为 kk 的序列 aa 合法当且仅当:

    • ∑ai=n\sum a_i=n。
    • 任意 1≤i<k1\le i<k, ai AND ai+1=ai+1a_i\text{ AND }a_{i+1}=a_{i+1} 。

    求合法序列个数。对 109+710^9+7 。

    考虑拆位贡献,则对于某一个二进制位,设 AiA_i 为 ii 的这个二进制位,则必然存在一个 jj 使得 i∈[1,j]i\in[1,j] 满足 Ai=1A_i=1 且其余为 00 。因此只要 ∑Ai\sum A_i 确定了,则这一二进制位的所有数均确定。

    不妨设 bib_i 表示第 ii 个二进制位的 11 的个数,则限制变为:

    ∑2ibi=n(bi≤k)\sum2^ib_i=n(b_i\le k)

    这是一个多重背包问题,看似是 O(n2log⁡n)\mathcal{O}(n^2\log n) 的复杂度,但是注意到复杂度是:

    $$\begin{aligned} \sum n\lfloor\frac{n}{2^i}\rfloor&=n\sum \lfloor\frac{n}{2^i}\rfloor\\&=\mathcal{O}(n^2) \end{aligned}$$

    于是直接写一个多重背包就能通过。

    • 1

    信息

    ID
    2771
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    (无)
    递交数
    19
    已通过
    8
    上传者