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\) 在这一位填什么,把算出低位的贡献和个数后用个数乘上这一位的贡献
总结
- 要从贡献在数位之间独立看出来是数位 \(DP\)
- 要把 \(\text{max}\) 转化掉
- 要想到同时 \(DP\) \(i,j,i xor j\)