微众2024暑期实习研发岗笔试编程题C++

题目描述:
给出四个非负整数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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值