서쪽에 있는 사이트의 개수 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;
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
ArrayList<Loc> list = new ArrayList<>();
for(int i = 0; i < n; i++) {
list.add(new Loc(in.nextInt(), in.nextInt()));
}
Collections.sort(list, new Comparator<Loc>() {
@Override
public int compare(Loc o1, Loc o2) {
if(o1.y == o2.y)
return o1.x - o2.x;
else
return o1.y - o2.y;
}
});
for(Loc i : list)
System.out.println(i);
}
}
class Loc{
int x;
int y;
public Loc(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return x + " " + y;
}
}
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<pair<int, int>> v;
for (int i = 0; i < n; i++) {
int x, y;
cin >> x >> y;
v.push_back(make_pair(y, x));
}
sort(v.begin(), v.end());
for (pair<int, int> p : v) {
cout << p.second << " " << p.first << '\n';
}
return 0;
}
pair는 첫 번째 원소(first)를 기준으로 오름차순 정렬, first가 같으면 두 번째 원소(second)를 기준으로 오름차순 정렬