알고리즘/백준

[백준 11051] 이항 계수 2 C++

겜도리도리 2021. 9. 16. 23:37
반응형

문제

백준 11051

 

11051번: 이항 계수 2

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

www.acmicpc.net

풀이

nCr = n * (n -1) * (n-2) * ... * (n-r+1) / r! 이지만

n과 r이 커지면 오버플로우가 발생합니다.

따라서 파스칼의 법칙을 사용하여 dp로 해결합니다.

위 그림을 보면 nCr에서 r이 0이거나, n = r일 때는 1, 나머지 경우에는 nCr = n-1Cr-1 + n-1Cr 입니다.

1C0과 1C1의 초기값을 설정해주고 dp를 이용해 nCk을 구합니다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#define num 10007
using namespace std;
 
int dp[1001][1001];
int n, k;
int main() {
    cin >> n >> k;
    dp[1][0= 1;
    dp[1][1= 1;
    for (int i = 2; i <= n; i++) {
        for (int j = 0; j <= k; j++) {
            if (j == 0 || i == j) {
                dp[i][j] = 1;
            }
            else {
                // 파스칼의 삼각형
                dp[i][j] = dp[i - 1][j - 1+ dp[i - 1][j];
                dp[i][j] %= num;
            }
        }
    }
    cout << dp[n][k];
    return 0;
}
cs
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2470] 두 용액 C++  (0) 2021.09.25
[백준 15686] 치킨 배달 C++  (0) 2021.09.18
[백준 5014] 스타트링크 C++  (0) 2021.09.16
[백준 11048] 이동하기 C++  (0) 2021.09.14
[백준 1915] 가장 큰 정사각형 C++  (0) 2021.09.13