- 문제 링크 : boj.kr/2830
- 난이도 : G3
- 태그 : 비트마스킹, 수학
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
vector<ll> cnt(21);
for(int i = 0; i < n; i++) {
ll input;
cin >> input;
ll idx = 0;
while(input) {
cnt[idx++] += input%2;
input /= 2;
}
}
ll ans = 0;
for(int i = 0; i < 21; i++) {
ans += cnt[i] * (n - cnt[i]) * (1 << i);
}
cout << ans;
return 0;
}
풀이
비트별로 구분하여 생각해 볼 수 있다.
어떤 비트가 결과에 몇 번 더해지는지 생각을 해보면, 0과 1이 짝지어질 때마다 결과에 한 번씩 더해지고, 결론적으로 0의 개수 * 1의 개수만큼 결과에 더해지게 된다.
이제 각 비트마다 1의 수를 세어주면 답을 구할 수 있다.
728x90
'PS' 카테고리의 다른 글
BOJ 24524 : 아름다운 문자열 (0) | 2024.07.12 |
---|---|
BOJ 31719 : UDP 스택 (0) | 2024.07.11 |
BOJ 17828 : 문자열 화폐 (0) | 2024.07.09 |
BOJ 15553 : 난로 (0) | 2024.07.08 |
BOJ 13910 : 개업 (0) | 2024.07.07 |