感覺是挺有趣的一道題qwq
枚舉 和 從高到底第一個不同的位 。
可以轉化成 ,且 。
這樣就保證了 和 在 之前位都相同,並且 在第 位大。
DP一下。
表示考慮前 個數, , 的第 位爲 。
時間複雜度 。
#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;
}