题目描述:
给出四个非负整数L,R,X,Y,请计算有多少个非负整数N满足以下四个条件:
1.N的二进制表示中1的个数不小于L
2.N的二进制表示中1的个数不大于R
3.N和X的按位与为X
4.N和Y的按位或为Y
#include <iostream>
#include <bitset>
#include<vector>
using namespace std;
int C(int n, int m)
{
if (m < n - m) m = n - m;
int ans = 1;
for (int i = m + 1; i <= n; i++) ans *= i;
for (int i = 1; i <= n - m; i++) ans /= i;
return ans;
}
int main() {
int T;
cin >> T;
vector<int> arr(T);
for(int j = 0;j<T;j++){
int L, R, X, Y;
cin >> L >> R >> X >> Y;
if (L > R) { int temp = R; R = L; L = temp; }
int count = 0;
if (L == R) { cout << count; return 1; }
bitset<30> bitX(X); //按位与为X表明该数在X为1的地方必为1
bitset<30> bitY(Y); //按位与为Y表明该数在Y为0的地方必为0
vector<int> pos;
for (int index = 0; index < 30; index++)
{
if (bitX.test(index) && (!bitY.test(index))) {
cout << count; return 1; // 表示在index位置无法满足条件
}
else if (bitX.test(index) || (!bitY.test(index)))
{
pos.push_back(index);
}
}
int fixed = pos.size();
int remain = 30 - fixed;
int Xones = bitX.count();
int remainones = R - Xones;
if (Xones < R) {
for (int i = 1; i <= remainones; i++)
{
if (i <= remain) { count = count + C(remain, i); };
}
}
arr[j] = count;
}
for (int j = 0; j < T; j++) { cout << arr[j] << endl; }
return 1;
}