티스토리 뷰

#include <iostream>
#include <vector>
using namespace std;

vector<vector<int> > memo;

int main(void)
{
    int n, k;

    scanf("%d %d", &n, &k);
    memo.resize(n + 1);
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= i; j++) {
            if (j == 0 || j == i)
                memo[i].push_back(1);
            else
                memo[i].push_back((memo[i - 1][j - 1] + memo[i - 1][j]) % 10007);
        }
    }
    printf("%d", memo[n][k]);

    return 0;
}

첫 번째 풀이는 1부터 n까지 각 팩토리얼에 mod 10007을 취한 값을 저장하고 N!/K!/(N-K)!을 구하는 방법이었다.
이 문제 분류가 DP인 걸 생각하면 이렇게 푸는게 아닐 것 같았지만 제출은 해봤다. 역시 틀렸음. 분자가 분모보다 작아져 N이 8쯤 되면 답으로 0이 나왔다.
구글에 이항 계수를 검색하고 위키백과를 누르니 파스칼의 삼각형이란게 있길래 그대로 구현했다.
아니... 사실 본 적 있다. 파스칼의 삼각형. 하지만 안쓰면 잊어버리는 법...
nCk = n-1Ck-1 + n-1Ck
이 식도 언젠가 쓴 적 있겠지... 지금 썼으니 기억에 좀 오래 남아주길 바란다.
DP보다는 수학문제를 푸는 기분이었다. DP를 몰라도 이항계수를 안다면 풀 수 있을 것이다.

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[BOJ] 1107 리모컨  (0) 2020.05.20
[BOJ] 10971 외판원 순회2  (0) 2020.05.15
[BOJ] 11057 오르막 수  (0) 2020.02.27
[BOJ] 10844 쉬운 계단 수  (0) 2020.02.27
[BOJ] 9465 스티커  (0) 2020.02.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
26 27 28 29 30 31
글 보관함