ps:problems:boj:33914
A = B ⊕ C
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 33914 |
문제명 | A = B ⊕ C |
레벨 | 골드 5 |
분류 |
수학 |
시간복잡도 | O(X+Y) |
인풋사이즈 | X<=3000, Y<=3000 |
사용한 언어 | Python 3.13 |
제출기록 | 34536KB / 48ms |
최고기록 | 32ms |
해결날짜 | 2025/05/23 |
풀이
- 기본 아이디어는 에디토리얼 에 설명되어있다
- 원소 3개를 한 그룹으로 묶어서 생각할때, 1을 두개 0을 한개 사용하는 방법이 3가지, 0만 세개 사용하는 방법이 1가지
- 그렇지만 에디토리얼에서는 이것을 기반으로 O(XY)의 DP로 푸는 방법만 설명하고 있는데, 실제로는 조합론적 풀이가 더 효율적이고 딱히 어렵지도 않다. 오히려 이게 더 쉬운 느낌인데..
- 같은 에디토리얼에서 even 하게 익은 SCON번은 DP와 조합론적 풀이를 모두 설명했는데, 이 문제는 설명이 좀 부실하다.
- 조합론적으로 풀면
- 총 그룹의 개수는 (X+Y)/3 개이고, 그중에서 1을 두 개 사용하는 그룹은 X/2 개 이다. 그룹들을 배치하는 방법의 수는 C(X+Y/3, X/2)가지
- 1을 두개 사용하는 그룹이 가질수 있는 형태는 3가지이다. X/2 개의 그룹이 각각 가질수 있는 형태를 생각하면 pow(3, X/2) 이다.
- 결국 정답은 C(X+Y/3, X/2) * pow(3, X/2) 이고, 컴비네이션의 계산에는 O(X+Y), 거듭제곱의 계산에는 O(logX)가 걸리므로 총 시간복잡도는 O(X+Y)이다.
코드
"""Solution code for "BOJ 33914. A = B ⊕ C".
- Problem link: https://www.acmicpc.net/problem/33914
- Solution link: http://www.teferi.net/ps/problems/boj/33914
Tags: [combinatoric]
"""
import math
MOD = 10**9 + 7
def main():
X, Y = [int(x) for x in input().split()]
if X % 2 == 1:
print('0')
return
n = (X + Y) // 3
k = X // 2
answer = math.comb(n, k) * pow(3, k, MOD) % MOD
print(answer)
if __name__ == '__main__':
main()
ps/problems/boj/33914.txt · 마지막으로 수정됨: 2025/06/05 07:06 저자 teferi
토론