1 条题解

  • 0
    @ 2026-9-3 11:12:46

    题解

    思路

    令长度为 nn 的核函数

    c[x]=bpopcount⁡(x).c[x]=b_{\operatorname{popcount}(x)}.

    一次能量变化正是异或卷积:ei=c∗xorei−1e_i=c*_{\mathrm{xor}}e_{i-1}。因此

    et=c∗t∗e0.e_t=c^{*t}*e_0.

    Walsh-Hadamard 变换 HH 把异或卷积变为逐点乘法,而且 H2=nIH^2=nI。若模数 pp 为奇素数,可以乘 n−1n^{-1} 完成逆变换;但本题的 pp 可以是任意合数,甚至是二的幂,逆元可能不存在。

    关键处理是把全部变换放在模数 pnpn 下进行。第二次 Hadamard 变换后的每个真实整数都含因子 nn。模 pnpn 的剩余类也仍能整除 nn,整除后恰好保留模 pp 的答案。因此无需任何逆元。

    做法

    子任务 1

    按题意重复 tt 次,每次枚举 u,vu,v 直接计算下一时刻。时间复杂度为 O(tn2)O(tn^2)。

    子任务 2

    在异或卷积环中对核 cc 做二进制快速幂:卷积单位元仅在下标 00 处为 11。每次卷积直接枚举两个下标,最后再与 e0e_0 卷积。时间复杂度为 O(n2log⁡t)O(n^2\log t)。

    满分算法

    取扩大模数 P=pnP=pn:

    1. 构造 c[x]=bpopcount⁡(x)c[x]=b_{\operatorname{popcount}(x)};
    2. 分别对 cc 与 e0e_0 做 Hadamard 变换;
    3. 对每个频率点,把 H(e0)H(e_0) 乘上 H(c)tH(c)^t;
    4. 再做一次 Hadamard 变换;
    5. 每项先除以 nn,再对 pp 取模。

    由于 cc 只依赖下标的置位数,它的变换值也只依赖频率下标的置位数,因此只需计算 m+1m+1 次快速幂。独立实现还可用 Krawtchouk 多项式

    Kj(s)=[xj](1−x)s(1+x)m−sK_j(s)=[x^j](1-x)^s(1+x)^{m-s}

    直接计算置位数为 ss 的特征值,以交叉核验 FWT 构造。

    所有模乘使用 128 位中间值,因为 PP 最大约为 101510^{15}。

    正确性证明

    核 c[uxor⁡v]c[u\operatorname{xor}v] 与题目转移系数完全相同,所以一次转移等价于异或卷积。卷积的结合律推出时刻 tt 的向量为 c∗t∗e0c^{*t}*e_0。

    Hadamard 变换满足 H(a∗xorb)=H(a)⋅H(b)H(a*_{\mathrm{xor}}b)=H(a)\cdot H(b),故频域逐点乘上 H(c)tH(c)^t 后得到 H(et)H(e_t)。再次变换得到 H2(et)=netH^2(e_t)=ne_t。

    设某个真实整数分量为 nqnq。在模 pnpn 下得到的标准剩余数为 n(q mod p)n(q\bmod p),因此它仍被 nn 整除,商恰为 q mod pq\bmod p。算法最后的整除步骤由此合法,即使 nn 在模 pp 下没有逆元也不受影响。

    因此算法输出的每一项都等于题目定义的 et[i] mod pe_t[i]\bmod p。

    复杂度分析

    满分算法时间复杂度为 O(nm+mlog⁡t)O(nm+m\log t),空间复杂度为 O(n)O(n),其中 n=2mn=2^m。

    • 1

    信息

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