通过二进制分析可知,该条件等价于 x⊕4x=5x 。由于 4x 是 x 的二进制左移两位, 5x=4x+x ,因此该条件成立的关键是 x 的二进制表示中不存在两个相距两位的 1(即没有位 i 和位 i+2 同时为 1)。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef int yy;
const int OvO = 0;
vector<int> to_binary(ll x)
{
vector<int> bits(64, 0);
for (int i = 63; i >= 0; i--)
{
bits[63 - i] = (x >> i) & 1;
}
return bits;
}
ll dp[65][2][2][2];
vector<int> bits;
ll dfs(int pos, int a, int b, int tight)
{
if (pos == 64)
return 1;
if (dp[pos][a][b][tight] != -1)
return dp[pos][a][b][tight];
ll res = 0;
int limit = tight ? bits[pos] : 1;
for (int val = 0; val <= limit; val++)
{
if (val == 1 && b == 1)
{
continue;
}
int new_a = val;
int new_b = a;
int new_tight = tight && (val == limit);
res += dfs(pos + 1, new_a, new_b, new_tight);
}
return dp[pos][a][b][tight] = res;
}
ll cnt(ll x)
{
bits = to_binary(x);
memset(dp, -1, sizeof(dp));
return dfs(0, 0, 0, 1);
}
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
ll t, l, r;
cin >> t;
while (t--)
{
cin >> l >> r;
cout << cnt(r) - cnt(l - 1) << endl;
;
}
return OvO;
}