P4067 [SDOI2016]储能表 题解

题意

给定\(n\)、\(m\)、\(k\)、\(p\),在模 \(p\) 意义下计算

\[\sum_{i=0}^{n-1} \sum_{j=0}^{m-1} \mathrm{max} ((i \mathrm{xor} j)-k,0) \]

\(T\) 组测试
\(T = 5000\),\(n \leq 10 ^ {18}\),\(m \leq 10 ^ {18}\),\(k \leq 10 ^ {18}\),\(p \leq 10 ^ 9\)

题解

\(\text{trick:}\)把 \(\sum \mathrm{max} (a-k,0)\) 变为 \((\sum [a\ge k]a)-(\sum [a\ge k])\cdot k\)
我们考虑 \(\mathrm{xor}\) 的特性是位之间独立,题目限制也只有数的大小,所以我们考虑数位 \(DP\) 。

问题等价于找到 \((i,j)\)满足\(i \mathrm{xor} j \ge k\) 的 \((i,j)\) 对数和 \(i \mathrm{xor} j\) 的和,\(i\) 与 \(j\) 显然要同时 \(DP\)

因为这里统计的对象是 \(i \mathrm{xor} j\) ,且它与 \(i\) ,\(j\),分别有限制,所以我们要额外记三个信息。
设 \(f_{i,l1,l2,l3}\) 为不考虑前 \(i\) 位的贡献,前 \(i\) 位是否卡到 \(n-1\) 的上界、是否卡到 \(m-1\) 的上界,\(xor\) 是否卡到 \(k\) 的下界。然后分别枚举 \(i\) 与 \(j\) 在这一位填什么,把算出低位的贡献和个数后用个数乘上这一位的贡献

总结

  1. 要从贡献在数位之间独立看出来是数位 \(DP\)
  2. 要把 \(\text{max}\) 转化掉
  3. 要想到同时 \(DP\) \(i,j,i xor j\)
上一篇:第一章 动态规划 数字三角形模型


下一篇:拉普拉斯锐化(Laplacian sharpening)