Solution S o l u t i o n
感觉是挺有趣的一道题qwq
枚举
A
A
和从高到底第一个不同的位
k
k
。
可以转化成
A xor B∈[2k,2k+1]
A
x
o
r
B
∈
[
2
k
,
2
k
+
1
]
,且
B or 2k=B
B
o
r
2
k
=
B
。
这样就保证了
A
A
和在
k
k
之前位都相同,并且在第
k
k
位大。
DP一下。
表示考虑前
i
i
个数,,
B
B
的第位为
0/1
0
/
1
。
时间复杂度
O(n2logn)
O
(
n
2
log
n
)
。
#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;
}