DP题目的状态表示真的很重要,直接决定了解决这题的时间、空间效率。
#include <bits/stdc++.h>
using namespace std;
long long s[40], t, x, a;
long long dp[40];
long long dfs(long long pos, long long lim)
{
if (pos == 0)
return 1;
if (!lim && dp[pos] != -1)
return dp[pos];
int up = lim ? s[pos] : 1;
long long sum = 0;
for (int i = 0; i <= up; i++)
{
if (i && ((1 << (pos - 1)) & a))
continue;
sum += dfs(pos - 1, lim && i == up);
}
if (!lim)
dp[pos] = sum;
return sum;
}
long long get(long long a, long long x)
{
memset(dp, -1, sizeof dp);
int pos = 0;
while (x)
{
s[++pos] = x % 2;
x /= 2;
}
return dfs(pos, 1);
}
int main()
{
cin >> t;
while (t--)
{
cin >> a >> x;
cout << get(a, x) - 1 << endl;
}
return 0;
}