[BOJ] Q2225 합분해
[BOJ] Q2225 합분해
Question
Language: Python
Difficulty: Gold 5
해당 문제는 점화식을 찾는 것이 핵심인 문제이다.
가령 n=6,k=4라고 했을때,
해당 경우는 의 합으로 표현할 수 있다. 0 + (6을 3가지 숫자의 합을 나타내는 경우의수) 1 + (5을 3가지 숫자의 합을 나타내는 경우의수) 2 + (4을 3가지 숫자의 합을 나타내는 경우의수) 3 + (3을 3가지 숫자의 합을 나타내는 경우의수) 4 + (2을 3가지 숫자의 합을 나타내는 경우의수) 5 + (1을 3가지 숫자의 합을 나타내는 경우의수) 6 + (0을 3가지 숫자의 합을 나타내는 경우의수)
이를 정규화 시켜보면 아래와 같다
Fn,k=F0,k-1+F1,k-1+F2,k-1…+Fn,k-1 으로 표현할 수 있다.
또한 자세히 보면 Fn-1,k=F0,k-1+F1,k-1+F2,k-1…+Fn-1,k-1
최종적으로 아래와 같은 점화식을 구할 수 있따. Fn,k=Fn-1,k+Fn,k-1
Solution 1
def solution():
di=[[0]* (k+1) for _ in range(n+1)]
di[0][0]=1
for i in range(k+1):
di[0][i]=1
for i in range(1,n+1):
for j in range(1,k+1):
di[i][j]=di[i-1][j]+di[i][j-1]
print(di[n][k]%1000000000)
if __name__ == "__main__":
n,k=map(int,input().split())
solution()
해당 문제는 중복조합을 이용해서도 풀이를 할 수 있다. 주어진 n을 k개의 정수합을 나타내는 것이므로, n개의 물건을 통해 k개의 그룹으로 나누는 것으로 생각할 수 있다
즉, n+1Hk-1을 통한 풀이도 가능하다.
Solution 2
from math import factorial
def solution():
count=factorial(n+k-1)//(factorial(k-1)*factorial(n))
print(count%1000000000)
if __name__ == "__main__":
n,k=map(int,input().split())
solution()
댓글남기기