실제로 경우의 수를 측정하면 그 수가 굉장히 많아진다. N과 K가 200까지 입력이 들어올 수 있기 때문에 일일히 확인하면 당연하게도 실행 시간 초과 문제가 발생할 것이기 때문에 이렇게 큰 수의 결과가 나오는 문제의 경우에는 점화식을 만들어서 해결할 수 있다. 변수간 어떤 관계가 성립하는지를 살펴보면 쉽게 점화식을 구할 수 있다.
이 문제에서는 두 정수 N과 K를 주기 때문에 N과 K의 관계를 살펴보자.
n을 k개로 나누는 경우의 수는 (0, [n을 k-1]개로 나눈 것) + (1, [n-1을 k-1]개로 나눈것), ··· , (n, [0을 k-1]개로 나눈 것) 이다.
이 때 k=1일때와 k=2일때의 n 값은 쉽게 구할 수 있다.
--- | n = 1 | n = 2 | n = 3 | n = 4 | n = 5 | ··· |
---|---|---|---|---|---|---|
k = 1 | 1 | 1 | 1 | 1 | 1 | ··· |
k = 2 | 2 | 3 | 4 | 5 | 6 | ··· |
k = 3 | 3 | 6 | 10 | 15 | 21 | ··· |
k = 4 | 4 | 10 | 20 | 35 | 56 | ··· |
와 같이 표를 구할 수 있고 문제에서 요구하는 n을 k로 나누는 경우의 수를 계산할 수 있다.
import sys
input = sys.stdin.readline
n, k = map(int, input().split())
dp = [[0] * 201 for i in range(201)]
# k=1, 2일 때는 바로 대입
for i in range(201):
dp[1][i] = 1
dp[2][i] = i + 1
for i in range(2, 201):
# n = 1일때는 k로 나눌 때 1의 위치만 k개로 바뀌기 때문에 바로 계산 가능
dp[i][1] = i
for j in range(2, 201):
dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % 1000000000
print(dp[k][n])