题目:XOR Pair
分析: 官方题解看不太懂 ,还是套平常的板子做;
分析 |x-y| 的数位,用dp[pos][v1][v2]存满足条件的pair(x,y)的个数
按二进制位分析,最多有64位,所以pos==64
条件限制 :
1. x^y == n ,对数位来说即每一位都有 [x]^[y] == [n] ,很常见的限制了,在循环里处理即可(但题解说这道题换成x&y==n 或 x|y == n 就会很麻烦?)
2.| x - y | <= m;
即 x-y <= m && x-y >= -m ,
即 m-x+y >= 0 && m+x-y >= 0
其中 x 可取 0 , 1 ,y可取 0 , 1
对于这两个式子数为分析 ,每一位可能是0 ,-1 ,1 ,2 四种情况 ,若不考虑进位(二进制dp常用处理 ):
若 [高位] >= 1 , 后面数位就算全取-1最后结果还满足条件 ,x,y取值不受限制,此位就算大于1也可以按1考虑
若 [高位] < -1 ,后面就算全取2也一定不行 ,所以直接返回0就行;
综上 ,这两个式子的数位上的取值 有 -1 , 0 ,1 三种取值 ,记为 状态[v1][v2] ,v1==3 ,v2==3;
3. 0 <= x <= a ,0<=y <=b ,直接用两个边界标记limx ,limy 进行特判即可
分析完条件限制就能进行数位dp了:
#include
#include
#include
#include
#include <set>
#include
#include
#include <string>
#include
#include
#include
// 想一想:这里状态转移与 十进制 和 取模 的时候的状态转移有什么相同和不同?
//想一想:这里状态转移与十进制和取模的时候的状态转移有什么相同和不同?