728x90
서쪽에 있는 사이트의 개수 n, 동쪽에 있는 사이트의 개수 m이 입력으로 주어지면 mCn을 구하면 된다.
간단한 조합(Combination) 문제이다. 그런데 문제는 nCr은 n!/r!(n-r)!이기 때문에 분자를 분모로 나누기 전의 숫자는 너무 커질 수도 있다. 따라서 nCr과 nCn-r은 같다는 성질을 이용하면 된다.
10C2나 10C8은 같다. 10C8보다는 10C2를 하는 것이 훨씬 효율적이다.
따라서 처음에 입력을 받고 r = min(r, n - r);로 r을 줄여주었다.
#include <iostream>
using namespace std;
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int t;
cin >> t;
for (int i = 0; i < t; i++) {
int r, n;
cin >> r >> n;
r = min(r, n - r);
long long numerator = 1;
long long denominator = 1;
for (int i = n; i > n - r; i--) {
numerator *= i;
}
for (int i = r; i >= 1; i--) {
denominator *= i;
}
cout << numerator / denominator << '\n';
}
return 0;
}
728x90
'알고리즘 문제' 카테고리의 다른 글
[백준] 1037번 약수 (0) | 2020.02.07 |
---|---|
[백준] 1094번 막대기 (0) | 2020.02.07 |
[백준] 1026번 보물 (0) | 2020.02.07 |
[백준] 4963번 섬의 개수 (0) | 2020.02.06 |
[백준] 1912번 연속합 (0) | 2020.02.06 |