본문 바로가기
알고리즘/백준

[백준] 2407. 조합

by vivi 2021. 11. 14.

단, n <=r,

d [n][r] = combi(d, n - 1, r - 1) + combi(d, n - 1, r); 순서 바꾸면 안 됨

n과 m의 범위가 100 정도만 돼도 long형의 범위를 벗어난다.

ex) 90C56 = 7077867820068919738609890, 100C50 = 100891344545564193334812497256

    public static int combi(int[][] d, int n, int r) {
        if (d[n][r] != 0) return d[n][r];
        if (n == r || r == 0) return 1;
        d[n][r] = combi(d, n - 1, r - 1) + combi(d, n - 1, r);
        return d[n][r];
    }

 

BigInteger를 사용하면 된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;

class Main {

    static BigInteger combi(BigInteger[][] c, int n, int m) {
        if (c[n][m] != BigInteger.ZERO) return c[n][m];
        if (n == m || m == 0) return BigInteger.ONE;
        c[n][m] = combi(c, n - 1, m - 1).add(combi(c, n - 1, m));
        return c[n][m];
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        BigInteger[][] c = new BigInteger[101][101];
        for (BigInteger[] b : c)
            Arrays.fill(b, BigInteger.ZERO);

        System.out.println(combi(c, Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));

        br.close();
    }
}

 

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

[백준] 10816. 숫자 카드 2  (0) 2021.11.16
[백준] 16916. 부분 문자열  (0) 2021.11.16
[백준] 1918. 후위표기식  (0) 2021.11.11
[백준] 18808. 스티커 붙이기  (0) 2021.11.02
[백준] 1629. 곱셈  (0) 2021.10.27

댓글