PS/Baekjoon

[Baekjoon] 11051 - 이항 계수 2

서현 SEOHYEON 2023. 5. 23. 10:13

📝 문제

 

 

🔑 풀이 과정

이 문제의 핵심 2가지는 DP 배열(조합론), 모듈러 연산의 분배법칙이다.

① N이 최대 1000까지 이므로, 일반적인 팩토리얼 계산법으로 하면 범위가 초과한다.

(*참고: 12!이 int 범위를 넘기고, 20!이 long 범위를 넘긴다.)

그러므로 조합 점화식을 사용한 DP 배열을 사용해 풀이한다.

 

② 또한 이항계수(N, K)를 10007로 나눈 나머지를 구하는게 목표이므로, 모듈러 연산의 분배법칙을 사용해준다.

- 공식

nCk % 10007
D[n][k] % 10007
(D[n-1][k-1] + D[n-1][k]) % 10007
((D[n-1][k-1] % 10007) + (D[n-1][k] % 10007)) % 10007

 

 

 

🔓 답안

import java.io.*;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        int[][] D = new int[N+1][N+1];

        for(int i = 0; i <= N; i++){
            D[i][i] = 1;
            D[i][1] = i;
            D[i][0] = 1;
        }

        //i가 3부터 시작하는 이유: 2행(i=2)까지는 바로 위 for문을 통해 값이 다 채워진다.
        //j가 2부터 i 전까지 수행되는 이유: 위 for문을 통해 0, 1, i일때의 값이 다 채워졌기 때문
        for(int i = 3; i <= N; i++){
            for(int j = 2; j < i; j++){
                D[i][j] = ((D[i-1][j-1] % 10007) + (D[i-1][j] % 10007)) % 10007;
            }
        }

        bw.write(D[N][M] + "\n");
        bw.flush();
        bw.close();
    }

}

 

 

 

🖤 알고리즘 분류

- 수학

- 다이나믹 프로그래밍

- 조합론