1 条题解

  • 0
    @ 2025-10-17 15:47:36

    题目分析

    我们要求的是: [ \sum_{i=0}^{n-1} \sum_{j=0}^{m-1} \max(i \oplus j - k, 0) \mod p ] 其中 \oplus 表示按位异或运算。


    问题转化

    S=i=0n1j=0m1(ij)S = \sum_{i=0}^{n-1} \sum_{j=0}^{m-1} (i \oplus j)
    设 $C = \sum_{i=0}^{n-1} \sum_{j=0}^{m-1} [i \oplus j \le k]$

    那么原式可以写成: [ \text{答案} = S - k \cdot C ] 因为: [ \sum \max(i \oplus j - k, 0) = \sum_{i \oplus j > k} (i \oplus j - k) = S - k \cdot C ]


    数位DP思路

    由于 n,m,kn, m, k 可能达到 101810^{18},我们需要用数位DP来处理。

    定义状态:

    • f[pos][limN][limM][limK]f[pos][limN][limM][limK]:考虑二进制前 pospos 位时,iji \oplus j总和
    • g[pos][limN][limM][limK]g[pos][limN][limM][limK]:考虑二进制前 pospos 位时,满足条件的方案数

    其中:

    • limNlimNii 是否还受到 n1n-1 的限制
    • limMlimMjj 是否还受到 m1m-1 的限制
    • limKlimKiji \oplus j 是否还受到 kk 的限制(用于计算 CC

    状态转移

    设当前位为 bitbit(从高位到低位),nb=n1nb = n-1 的当前位,mb=m1mb = m-1 的当前位,kb=kkb = k 的当前位。

    对于总和 SS

    枚举 ii 的当前位 xx(0或1),jj 的当前位 yy(0或1):

    • 如果 xxlimNlimNnb=0nb=0,不能选1
    • 如果 yylimMlimMmb=0mb=0,不能选1

    当前位的贡献是 (xy)2pos(x \oplus y) \cdot 2^{pos},乘以低位方案数,加上低位的总和。

    对于计数 CC

    枚举 x,yx, y 同上,但还要考虑 limKlimK

    • 如果 limKlimK(xy)>kb(x \oplus y) > kb,不能选
    • 如果 limKlimK(xy)=kb(x \oplus y) = kb,下一位继续受限制
    • 如果 limKlimK(xy)<kb(x \oplus y) < kb,下一位不受限制

    算法流程

    1. n1,m1,kn-1, m-1, k 二进制分解
    2. 用记忆化搜索计算:
      • S=f[0][1][1][0]S = f[0][1][1][0](计算总和时不受 kk 限制)
      • C=g[0][1][1][1]C = g[0][1][1][1](计算计数时受 kk 限制)
    3. 答案 = (SkC)modp(S - k \cdot C) \mod p

    代码实现细节

    • 使用 long long 存储状态,注意取模
    • 记忆化搜索时,状态用 pos, limN, limM, limK 表示
    • 注意 n1,m1n-1, m-1 可能为负数的情况(当 n=0n=0m=0m=0 时)

    时间复杂度

    数位DP的状态数是 O(logmax(n,m,k)×23)=O(60×8)O(\log \max(n,m,k) \times 2^3) = O(60 \times 8),非常高效。


    样例验证

    n=3,m=3,k=1n=3, m=3, k=1 为例:

    • 原始表格:
      0 1 2
      1 0 3
      2 3 0
      
    • 减1后:
      max(0,0) max(0,0) max(1,0) = 0 0 1
      max(0,0) max(0,0) max(2,0) = 0 0 2  
      max(1,0) max(2,0) max(0,0) = 1 2 0
      
    • 总和 = 0+0+1+0+0+2+1+2+0 = 6,符合输出。

    总结

    本题的关键在于:

    1. max(ijk,0)\max(i \oplus j - k, 0) 转化为 SkCS - k \cdot C
    2. 使用数位DP同时计算异或和方案数
    3. 注意边界情况和取模运算

    这种方法可以处理 101810^{18} 级别的数据,时间复杂度 O(logmax(n,m,k))O(\log \max(n,m,k))

    • 1

    信息

    ID
    3225
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者