1 条题解

  • 0
    @ 2025-8-24 23:12:34

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar nb_jzy
    寄蜉蝣于天地,渺沧海之一粟

    搬运于2025-08-24 23:12:34,当前版本为作者最后更新于2025-06-23 16:56:03,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题意

    给你 n=2mn=2^m 个数,a0,a1,a2...an2,an1a_0,a_1,a_2...a_{n-2},a_{n-1}

    一次操作将所有 aia_i 改为 $b_i=\sum _{\operatorname{popcount}(j \oplus i)=1}a_i$。其中 \oplus 表示异或,popcount(x)\operatorname{popcount}(x) 表示 xx二进制位中 11 的个数。

    简单来说,就是将所有二进制位只有一位ii 不同的那些值求和。

    现在需要求出进行 t1018t\le 10^{18} 轮操作之后 aia_i 的值。

    思路

    tt 十分的大,这提示需要用类似于快速幂的东西。

    观察一次操作的性质,显然可以将其写成矩阵,然后再快速幂就行了,但 n220n\le 2^{20},复杂度过高。

    尝试对式子变形,发现每次操作等价于:

    bi=j=0m1ai2jb_i=\sum_{j=0}^{m-1}a_{i\oplus 2^j}

    这和异或卷积十分相似。

    做法

    构造一个函数 G(x)G(x),使得只有在 2j2^j 的位置上为 11,其他位置上为 00,那原式就变为了:

    bi=jk=iaj×G(k)b_i=\sum_{j\oplus k=i}a_j\times G(k)

    然后直接用 FWT 求解即可。tt 很大,所以先对 GG 进行 tt 次自卷积,最后再用一遍 IFWT 就行了,时间复杂度 O(nlogt+nlogn)\mathcal O(n\log t+n\log n)

    注意,模数不为质数,IFWT 时 22 不一定有逆元,所以需要使用一个小技巧:a÷bmodc=(amodbc)÷ba\div b\mod c=(a\mod bc) \div b

    即先对于 k×nk\times n 取模,最后再除以 nn

    优化

    这样实现的常数比较大,可以进行一些优化。

    注意到 GG 有值的地方很少,打表后发现 FWT 后值域十分稀疏。而快速幂实际上算的就是 Gt(i)G^t(i),于是可以先预处理所有出现的 G(i)G(i)Gt(i)G^t(i),然后再直接调用就行了。

    优化比较显著,从 3.72s 优化到了 547ms。

    • 1

    信息

    ID
    11230
    时间
    5000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者