SolutionSolution
感觉是挺有趣的一道题qwq
枚举AA和从高到底第一个不同的位kk。
可以转化成A xor B∈[2k,2k+1]A xor B∈[2k,2k+1],且B or 2k=BB or 2k=B。
这样就保证了AA和在kk之前位都相同,并且在第kk位大。
DP一下。
表示考虑前ii个数,,BB的第位为0/10/1。
时间复杂度O(n2logn)O(n2logn)。
#include <bits/stdc++.h>
using namespace std;
const int N = 2050;
const int MOD = 1000000007;
int dp[N][N][2];
int n, m, ans;
inline void add(int &x, int a) {
x += a; while (x >= MOD) x -= MOD;
}
int main(void) {
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
cin >> n >> m;
for (int k = 0; k <= 10; k++) {
dp[0][0][0] = 1;
for (int i = 1; i <= max(n, m); i++) {
for (int j = 0; j < 2048; j++)
for (int d = 0; d < 2; d++) {
dp[i][j][d] = dp[i - 1][j][d];
if (i <= n) add(dp[i][j][d], dp[i - 1][j ^ i][d]);
if (i <= m) add(dp[i][j][d], dp[i - 1][j ^ i][d ^ (i >> k & 1)]);
}
}
for (int i = 1 << k; i < (1 << k + 1); i++)
add(ans, dp[max(n, m)][i][1]);
}
cout << ans << endl;
return 0;
}