※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25367번 문제인 너무 시시했다이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25367
25367번: 너무 시시했다
각 질문에 대해 조건에 맞는 (a, b) 쌍의 개수를 구하여 한 줄에 하나씩 차례로 출력한다.
www.acmicpc.net
A+B = (A^B) + ((A&B)<<1) 와 같은 식이 성립함은 잘 알려져있다. 두 이진수 A와 B의 대응되는 자리가 1이 아닌 경우의 합을 A^B로, 대응되는 자리가 모두 1인 경우의 값을 받아올림을 한다고 생각해보자.
위 식을 이용하면 A+B와 A^B의 값이 정해지면 (그러한 A와 B가 존재한다는 가정 하에) A&B의 값 또한 정해짐을 알 수 있다.
A^B와 A&B의 각 자리를 살펴 가능한 A와 B의 쌍의 개수를 세는 것으로 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
int Q;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> Q;
while (Q--) {
ll x, y; cin >> x >> y;
ll val = x - y;
if ((val < 0) || (val & 1)) cout << 0 << '\n';
else {
ll ans = 1;
val >>= 1;
while (y || val) {
if (y & 1) {
if (val & 1) ans = 0;
else ans <<= 1;
}
y >>= 1, val >>= 1;
}
cout << ans << '\n';
}
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 16210 // C++] DSHS Bank (0) | 2023.09.13 |
---|---|
[BOJ 16209 // C++] 수열 섞기 (0) | 2023.09.12 |
[BOJ 11946 // C++] ACM-ICPC (0) | 2023.09.10 |
[BOJ 27198 // C++] kex (0) | 2023.09.08 |
[BOJ 3895 // C++] 그리고 하나가 남았다 (0) | 2023.09.07 |