fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 25367 (C++) 너무 시시했다
최초 업로드: 2025-08-30 05:24:45
최근 수정 시간: 2025-08-30 05:25:12
게시자: rlatjwls3333
카테고리: 백준
조회수: 8
# [Gold II] 너무 시시했다 [문제 링크](https://www.acmicpc.net/problem/25367) ## 문제 설명 <p>영욱이는 민성이에게 다음과 같은 문제를 냈다.</p> <blockquote> <p>음이 아닌 두 정수 <i>x</i>와 <i>y</i>에 대해서 <em>a </em>+ <em>b </em>= <em>x</em>이고 <em>a </em>^ <em>b </em>= <em>y</em>인 음이 아닌 두 정수의 순서쌍 (<em>a</em>,<em> b</em>)는 모두 몇 개일까? (단, ^는 bitwise xor이다.)</p> </blockquote> <p>민성이는 이 문제가 너무 시시했다. 그러니 여러분이 대신 풀어 주자. 한 문제만 푸는 건 너무 시시하니까, <em>q</em> 문제를 동시에 풀어서 그나마 흥을 돋워 보자.</p> ## 입력 <p>첫 번째 줄에 질문의 수 <em>q</em>가 주어진다.</p> <p>두 번째 줄부터 (<em>q</em> + 1) 번째 줄까지 각 줄에 각 질문의 <em>x</em>와 <em>y</em>가 공백으로 구분되어 차례로 주어진다.</p> ## 출력 <p>각 질문에 대해 조건에 맞는 (<em>a</em>, <em>b</em>)<em> </em>쌍의 개수를 구하여 한 줄에 하나씩 차례로 출력한다.</p> ## 풀이 A+B = A^B + (A&B)<<1 이라는 식을 풀고, A&B 와 A^B 비트를 비교하며 경우의 수를 세주었다. ``` c++ #include<bits/stdc++.h> using namespace std; typedef long long ll; ll x, y; ll solve() { // x = A+B = A^B + (A&B)<<1 // (A&B)<<1 = x-y if(y>x || (x-y)&1) return 0; ll ret=1; ll tmp = x-y >> 1; while(tmp || y) { if(y&1) { if(tmp&1) return 0; ret<<=1; } tmp>>=1; y>>=1; } return ret; } int main() { ios::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while(t--) { cin >> x >> y; cout << solve() << '\n'; } } ```