30pts求调
查看原帖
30pts求调
1120943
YangFangYe楼主2025/7/29 08:13
#include <iostream>
#include <cstring>
using namespace std;

int c[32][32];

void init() {
    memset(c, 0, sizeof(c));
    for (int i = 0; i < 32; i++) {
        c[i][0] = 1;
        for (int j = 1; j <= i; j++) {
            c[i][j] = c[i-1][j-1] + c[i-1][j];
        }
    }
}

int sum(int l, int k) {
    int ans = 0;
    int max_aa = (l - k) / 2;
    for (int i = 0; i <= max_aa; i++) {
        ans += c[l][i];
    }
    return ans;
}

int solve(int x) {
    if (x == 0) return 0;
    int ans = 0;
    bool bits[32] = {false};
    int t = 0;
    while (x != 0) {
        bits[++t] = (x & 1);
        x >>= 1;
    }
    for (int len = 1; len < t; len++) {
        ans += sum(len - 1, 1);
    }
    int aa = 1;
    int bb = 0;
    
    for (int i = t - 1; i >= 1; i--) {
        if (bits[i]) {
            ans += sum(i - 1, aa - bb - 1);
            aa++;
        } else {
            bb++;
        }
    }
    
    if (aa <= bb) {
        ans++;
    }
    
    return ans;
}

int main() {
    init();
    int l, r;
    cin >> l >> r;
    cout << solve(r) - solve(l - 1) << endl;
    return 0;
}
2025/7/29 08:13
加载中...