백준 알고리즘

[백준 알고리즘] 백준 9527 c++

mindun 2025. 2. 12. 10:24
반응형

시간 제한, 수의 범위를 유의 하여 비트마스킹으로 문제를 풀어야 한다.

 

주요 점화식 >>

-  비트 자릿수가 i 일때, 그 이전 값들의 총 비트 수를 구하는 점화식

 

d[i]=d[i−1]+(i번 비트를 뺀 나머지 반복되는 수들의 1의 개수) + (i번째 비트에 나타나는 1의 수) 

 

#include <iostream>
#include <cmath>

long long a, b;
long long d[55];

long long go(long long x, long long i = 54) {
    long long ans = x & 1;
    for (; i > 0; i--) {
        if (x & (1LL << i)) {
            ans += d[i - 1] + (x - (1LL << i) + 1);
            x -= 1LL << i;
        }
    }
    return ans;
}

int main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);

    d[0] = 1;
    for (long long i = 1; i < 55; i++) {
        d[i] = d[i - 1] * 2 + (1LL << i);
    }
    std::cin >> a >> b;
    std::cout << go(b) - go(a - 1);
}
반응형