728x90
#10422 괄호
import sys
import math
input = sys.stdin.readline
p = 1000000007
def catalan(n):
return (math.factorial(2*n) // (math.factorial(n+1) * math.factorial(n))) % p
N = int(input())
result = []
for i in range (0,N):
a = int(input())
if a % 2 != 0:
result.append(0)
else:
result.append(catalan(a//2))
for i in range (0,N):
print(result[i])
카탈랑 수에 대한 내용이다.
과거 KMO (이젠 추억이 되어버린 올림피아드 ㅋㅋ;)를 준비하면서 공부한 기억이 있어서 바로 적용할 수 있었다.
이와 비슷한 레파토리로,
- +(+1)와 -(-1)로 이루어진 sequence에서, +와-를 각각 n번씩 사용하여 2k번째마다 (k=1,2,3 ....,n) 항상 0이상이 되게끔 만드는 수열의 갯수를 구하시오 등등 ...
- 계단의 오르막과 내리막을 같은 갯수씩 부여하고, 지하에 들어가지 않게끔 코스를 짜는 방법 etc ...
이런 문제들이 많이 있었다.
이제는 다 까먹어버려서 포함배제, 비둘기집의 원리, 카탈랑수, 중복조합, 중복순열 이런것들밖에 기억이 안 나지만 ...
그래도 프로그래밍을 하면서 이런 옛날 추억이 다시 한번씩 떠오르는게 좋은 것 같다.
아차. 코드 설명에 대한것을 첨언하자면,
given int a가 홀수인 경우에는, 절대 닫힐 수 없으므로 이에 유의하고 항상 0으로 만들어주자.
짝수인 경우에는, 위의 설명과 같이 n = 2k 꼴로 생각한 뒤 k번째 catalan 수를 대입해주면 된다.
'코딩' 카테고리의 다른 글
[BOJ] 백준 3671 산업스파이의 편지 Python (0) | 2023.10.28 |
---|---|
[BOJ] 백준 2436 공약수 Python (0) | 2023.10.28 |
[BOJ] 백준 28427 Tricknology Python (1) | 2023.10.28 |
[BOJ] 백준 28683 피타!피타!피타츄! Python (1) | 2023.10.28 |
[BOJ] 백준 20157 화살을 쏘자! Python (0) | 2023.10.28 |