728x90
 

1010번: 다리 놓기

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

www.acmicpc.net

서쪽에 있는 사이트의 개수 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

+ Recent posts