๐Ÿงท ๋ฌธ์ œ

https://www.acmicpc.net/problem/2225

0๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ •์ˆ˜ K๊ฐœ๋ฅผ ๋”ํ•ด์„œ ๊ทธ ํ•ฉ์ด N์ด ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๐Ÿ›  ํ’€์ด

ํ˜ผ์ž ํ’€๋‹ค๊ฐ€ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.
์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์˜ ํ’€์ด๋ฅผ ๋ณด๋‹ˆ ์ด ๋ฌธ์ œ๋Š” DP๋กœ ํ‘ธ๋Š” ๊ฒƒ๊ณผ ์ค‘๋ณต์กฐํ•ฉ์„ ์ด์šฉํ•ด ํ‘ธ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

1. DP

Step 1.
 ๋จผ์ € DP table์„ (K x K)์˜ 2์ฐจ์› ํ…Œ์ด๋ธ”๋กœ ์ •์˜ํ•˜๊ณ , 0๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ •์ˆ˜ K๊ฐœ๋ฅผ ๋”ํ•ด์„œ ๊ทธ ํ•ฉ์ด N์ด ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ dp[N][K]์— ๋„ฃ์–ด์ค€๋‹ค.

ex) N = 0, K = 2 ์ผ ๊ฒฝ์šฐ : 0๋ถ€ํ„ฐ 2๊นŒ์ง€์˜ ์ •์ˆ˜ 1๊ฐœ๋ฅผ ๋”ํ•ด ํ•ฉ์ด 2๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๋‹ค.
๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 0+0 ํ•œ ๊ฐ€์ง€ ๋ฐ–์— ์—†์„ ๊ฒƒ์ด๋‹ค. ์ฆ‰, d[0][2] = 1

ex) N = 1, K = 2 ์ผ ๊ฒฝ์šฐ : 0๋ถ€ํ„ฐ 2๊นŒ์ง€์˜ ์ •์ˆ˜ 2๊ฐœ๋ฅผ ๋”ํ•ด ํ•ฉ์ด 2๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๋‹ค.
๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 0+1, 1+0 ๋‘ ๊ฐ€์ง€์ด๋‹ค. ์ฆ‰, dp[1][2] = 2

ex) N = 2, K = 2 ์ผ ๊ฒฝ์šฐ : 0๋ถ€ํ„ฐ 2๊นŒ์ง€์˜ ์ •์ˆ˜ 2๊ฐœ๋ฅผ ๋”ํ•ด ํ•ฉ์ด 2๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๋‹ค.
๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 0+2, 1+1, 2+0 ์„ธ ๊ฐ€์ง€์ด๋‹ค. ์ฆ‰, dp[2][2] = 3

ex) N = 2, K = 3 ์ผ ๊ฒฝ์šฐ : 0๋ถ€ํ„ฐ 2๊นŒ์ง€์˜ ์ •์ˆ˜ 3๊ฐœ๋ฅผ ๋”ํ•ด ํ•ฉ์ด 2๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๋‹ค.
๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 0+0+2, 1+0+1, 0+1+1, 0+2+0, 2+0+0, 1+1+0, ์—ฌ์„ฏ ๊ฐ€์ง€์ด๋‹ค. ์ฆ‰, dp[2][3] = 6

์—ฌ๊ธฐ์—์„œ K = 3 ์ธ ๊ฒฝ์šฐ๋Š” K = 2 ์ธ ๊ฒฝ์šฐ์—์„œ ์ •์ˆ˜ 1๊ฐœ๋ฅผ ๋” ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.
์ •๋ฆฌํ•˜๋ฉด, ์œ„์˜ ์˜ˆ์—์„œ dp[2][3]์€ 0๋ถ€ํ„ฐ 2๊นŒ์ง€ 2๊ฐœ์˜ ์ •์ˆ˜๋ฅผ ๋”ํ•ด ํ•ฉ์ด 0 ~ 2๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์—์„œ ๋ถ€์กฑํ•œ i๋งŒํผ์„ ๋”ํ•ด์ค€ ๊ฒƒ์ด๋‹ค.
์ฆ‰, dp[2][3] = dp[0][2] + dp[1][2] + dp[2][2] (๊ฐ๊ฐ ๋ถ€์กฑํ•œ 2, 1, 0์„ ๋”ํ•ด์ค€๋‹ค)

Step 2.
 ํ•˜์ง€๋งŒ ์œ„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ•˜๋ฉด

for i in range(1, n+1):
    for j in range(1, k+1):
        for k in range(i):
            dp[i][j] += dp[k][j-1]

for๋ฌธ์„ ์‚ผ์ค‘์œผ๋กœ ๋Œ๊ธฐ ๋•Œ๋ฌธ์— O(N^3) ์— ์ˆ˜๋ ดํ•˜๋Š” ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

Step 3.
 ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‹์„ ๋‹ค์‹œ ๋“ค์—ฌ๋‹ค๋ณด๊ฒŒ ๋˜๋ฉด,
dp[N][K] ={dp[0][K-1] + dp[1][K-1] + ... + dp[N-2][K-1] + dp[N-1][K-1]}+ dp[N][K-1]
{dp[0][K-1] + dp[1][K-1] + ... + dp[N-2][K-1] + dp[N-1][K-1]}๋ฅผ dp[N-1][K] ๋กœ ์น˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ dp[N][K] = dp[N-1][K] + dp[N][K-1] ์ด๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ณ  ์ด๊ฑธ ํ†ตํ•ด ์›ํ•˜๋Š” ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์ค‘๋ณต์กฐํ•ฉ

Step 1.
 ์ด ๋ฌธ์ œ๋Š” 0 ~ N๊นŒ์ง€์˜ ์ •์ˆ˜ K๊ฐœ๋ฅผ ๋”ํ•ด์„œ ํ•ฉ์ด N์ด ๋˜๋Š” ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
 ์ค‘๋ณต์กฐํ•ฉ์€ n๊ฐœ์˜ ์›์†Œ์—์„œ r๊ฐœ๋ฅผ ์ค‘๋ณต์„ ํ—ˆ๋ฝํ•˜์—ฌ ๋ฝ‘์„ ๋•Œ์˜ ๊ฐ€์ง“์ˆ˜์ด๋‹ค. nHr = (n+r-1)Cr

Step 2.
 ๋ฌธ์ œ์— ์ ์šฉํ•˜๋ฉด K๊ฐœ์˜ ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ N์„ ๋งŒ๋“ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— kHn์„ ๊ตฌํ•˜๋ฉด ๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

Step 3.
kHn = (k+n-1)Cn = (k+n-1)! / (k-1)! * n!

๐Ÿ–Š ๋‚˜์˜ ์ฝ”๋“œ

import sys

if __name__ == "__main__":
    n, k = map(int, input().split())

    dp = [[0]*(k+1) for _ in range(n+1)]

    for i in range(k+1):
        dp[0][i] = 1

    for i in range(1, n+1):
        for j in range(1, k+1):
            dp[i][j] = dp[i][j-1] + dp[i-1][j]
            dp[i][j] %= 1000000000

    print(dp[n][k])

######์ค‘๋ณต์กฐํ•ฉ######

import sys

def fac(n):
    res = 1
    for _ in range(1, n+1):
        res *= _
    return res

if __name__ == "__main__":
    n, k = map(int, input().split())
    print((fac(k+n-1) // (fac(k-1) * fac(n))) % 1000000000)