사용자 도구

사이트 도구


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()

토론

댓글을 입력하세요:
R A F H J
 
ps/problems/boj/33914.txt · 마지막으로 수정됨: 2025/06/05 07:06 저자 teferi