※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts