X+Y = X | Y인 Y중에 K번째인 것을 찾아야한다.
X + Y = X | Y를 만족하는 Y를 구하는 방법은 간단하다.
이진수로 표현했을 때 X가 1인 부분이 겹치지 않는 수가 Y다.
X가 5일 때 2진수로 표현하면 101인데 1~7번째 수를 늘어놓으면
00101
00010 : 1
01000 : 2
01010 : 3
10000 : 4
10010 : 5
11000 : 6
11010 : 7
이 된다. 이걸 구하기 위해 X가 1인 줄을 제외하고 보면
001
010
011
100
101
110
111
이 되므로 K를 2진수로 만든 후 X가 1인 부분은 건너뛰면서 입력해 주면 된다.
X와 K가 둘다 2e9까지이므로 답은 int범위를 벗어나는 것을 유념하자.
<코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> bool c[65]; int n, k; long long ans, p = 1; int main() { scanf("%d%d", &n, &k); for (int ind = 0; n > 0; n /= 2) c[ind++] = n % 2; for (int i = 0; i < 65 && k; i++, p *= 2) if (!c[i]) { if (k % 2) ans += p; k /= 2; } printf("%lld\n", ans); return 0; } | cs |
'BOJ' 카테고리의 다른 글
1874 스택수열 (0) | 2017.10.03 |
---|---|
1992 쿼드트리 (0) | 2017.10.03 |
1987 알파벳 (0) | 2017.10.03 |
1269 대칭 차집합 (0) | 2017.10.03 |
13200 light up (0) | 2017.09.12 |