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\)
posted @ 2022-01-28 08:53  Lumos壹玖贰壹  阅读(22)  评论(0编辑  收藏  举报