PS/BOJ

[11051 C++, python] 이항 계수 2

두번째하늘 2022. 2. 6. 02:59
728x90

문제 구분 - Dynamic Programing

 

11051번: 이항 계수 2

첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 1,000, 0 ≤ \(K\) ≤ \(N\))

www.acmicpc.net

동기들과 랜덤실버디펜스할때 처음 봤던 문제다.

사실 처음 봤다고 말하기도 좀 애매한게 여러 번 풀었던 유형이었다.

(그런데도 못맞..)

이 문제는 파이썬으로 팩토리얼 돌려버리면 풀리긴 하는데 문제 출제 의도는 dp였다고 생각한다. 

//
//  main.cpp
//  11051
//
//  Created by jisu on 2022/02/06.
//

#include <iostream>

using namespace std;

int bino[1001][1001] = {0,};

int main(void) {
    int n, k;
    cin >> n >> k;
    //nCr = n-1Cr-1 + n-1Cr
    bino[1][0] = 1;
    bino[1][1] = 1;
    for (int i=2; i<=n; i++){
        for (int j=0; j<=k; j++){
            if (j==0 || j==i){
                bino[i][j] = 1;
            }
            else{
                bino[i][j]=bino[i-1][j-1]%10007+bino[i-1][j]%10007;
            }
        }
    }
    cout << bino[n][k]%10007 << "\n";
    return 0;
}

조합 관련해서 고등학교때 가장 중요했던 성질 하나가 바로 

nCr = n-1Cr-1 + n-1Cr

이었는데 이 성질을 dp에다가 적용할 수 있었다. 

파스칼의 삼각형도 잊어먹어서 리마인드겸 사진도 올려본다.

from math import factorial
n, k = map(int, input().split())
result = factorial(n)//(factorial(k) * factorial(n - k))
print(result % 10007)

파이썬으로 풀면 풀리긴 하더라.. 

728x90