Algorithm
[BOJ] 조합 2407번 C++
따봉치치
2025. 1. 10. 14:22
문제
nCm을 출력한다.
입력
n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n)
출력
nCm을 출력한다.
접근 방식
조합 자체를 구하는 것은 쉽다
하지만 100C100일 경우
long long 의 범위를 넘어가기 때문에 큰 수 구하기 방식으로 풀어야 한다
찾아보다가 나는 배열 자체를 vector<int> 형식으로 풀이하는 방식으로 풀었다.
typedef로 vector<int>를 BigInt 형으로 선언한 후,
기존에 풀던 대로 dp 배열을 BigInt 형으로 선언해 사용해주면 된다.
코드 자체는 복잡했지만
알고보면 원래 조합을 구하는 dp 코드 그 자체임을 알 수 있다
코드
#include<bits/stdc++.h>
using namespace std;
typedef vector<int> BigInt;
BigInt dp[103][103];
BigInt add(BigInt a, BigInt b) {
BigInt res;
int carry = 0,sum = 0;
int size = max(a.size(), b.size());
for(int i=0; i<size || carry; i++) {
if(i < a.size()) sum += a[i];
if(i < b.size()) sum += b[i];
sum += carry;
res.push_back(sum%10);
carry = sum / 10;
sum = 0;
}
return res;
}
int main() {
int n,m; cin>>n>>m;
dp[0][0] = {1};
for(int i=1; i<=100; i++) {
dp[i][0] = {1};
for(int j=1; j<=100; j++) {
dp[i][j] = add(dp[i-1][j], dp[i-1][j-1]);
}
}
BigInt res = dp[n][m];
for(auto it = res.rbegin(); it != res.rend(); it++) cout<<*it;
}