https://www.acmicpc.net/problem/2407
2407번: 조합
n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n)
www.acmicpc.net
알고리즘 분류
- 수학
- 조합론
- 임의 정밀도 / 큰 수 연산
문제 풀이
문제는 아주 단순하다. 조합 $ _nC_m $을 찾아내면 된다.
하지만 입력의 조건에서 나올 수 있는 최대값 $ _{100}C_{50} $ = 100891344545564193334812497256 로 $ 10^{29} $ 정도이다.
다행스럽게 __uint128_t 자료형으로 3 * 10^38까지의 숫자를 담을 수 있다.
하지만 위 자료형을 출력할 수 있는 포맷이 없어서 이 부분을 신경써주면 될 듯하다.
시간 초과를 방지하기 위해 문제를 dynamic programming 방식으로 풀 것이다.
코드 구현
#include <iostream>
#include <cmath>
using namespace std;
__uint128_t dp[101][101] = {0};
__uint128_t comb(int n, int m){
if(m > n - m) m = n - m;
if(m == 0) return 1;
if(m == 1) return n;
if(dp[n][m] != 0) return dp[n][m];
return dp[n][m] = comb(n-1, m-1) + comb(n-1, m);
}
int main(){
int N, M; cin >> N >> M;
__uint128_t result = comb(N, M);
string f = to_string((long long) (result / (__uint128_t) pow(10, 15)));
string s = to_string((long long) (result % (__uint128_t) pow(10, 15)));
if(f == "0") cout << s;
else cout << f + s;
}
'💾 Algorithm > 문제 풀이' 카테고리의 다른 글
[JavaScript] 백준 11403번: 경로 찾기 (플로이드 워셜) (4) | 2024.10.29 |
---|---|
[Algorithm] 백준 1167 트리의 지름 (C++) (0) | 2023.06.07 |
[Algorithm] 백준 1992 쿼드트리 (C++) (0) | 2023.05.30 |
[Algorithm] 백준 1389 케빈 케이컨의 6단계 법칙 (C++) (0) | 2023.05.29 |
[Algorithm] 백준 11727 2×n타일링2 (C++) (0) | 2023.05.26 |