BZOJ4513: [Sdoi2016]储能表(数位dp)
题目链接 Sol 一点思路都没有,只会暴力,没想到标算是数位dp??Orz 首先答案可以分成两部分来统计 设 \[ f_{i,j}= \begin{aligned} i\oplus j &\left( i\oplus j >k\right) \\ 0 &\left( i\oplus j <=k\right) \end{aligned} \] 那么我们要求的就是 \[\sum_{i=0}^{n - 1} \sum_{j = 0}^{m - 1} f(i, j) - k * \sum_{i = 0}^{n - 1} \sum_{j = 0}^{m - 1} [f(i, j)]\] 也就是说,我们要统计出满足条件的数的异或和以及满足条件的数的对数 考虑直接在二进制下数位dp,注意这里我们要记三维状态 \(f[len][0/1][0/1][0/1]\) 表示此时到第 \(len\) 位,是否顶着 \(n\) 的上界,是否顶着 \(m\) 的上界,是否顶着 \(k\) 的下界 然后直接dp就可以了 // luogu-judger-enable-o2 #include<bits/stdc++.h> #define Pair pair<LL, LL> #define MP make_pair #define fi first #define se second #define LL long