https://www.acmicpc.net/problem/1010
public class Problem1010_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
System.out.println(combination(M, N));
}
}
public static long combination(int n, int r) {
long a = 1;
long b = 1;
for (long i = n; i > n - r; i--) {
a = a * i;
}
for (long i = r; i > 0; i--) {
b = b * i;
}
return a / b;
}
29C16
에서 long
타입의 최대값을 넘어가 오버플로우 발생15!
→ int
초과21!
→ long
초과
public class Problem1010 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
// N과 M의 범위가 30까지이므로 크기가 30X30인 조합을 나타내는 이차원 배열 생성
// 즉, 3C2라 하면 arr[3][2]가 되는 것!
int[][] arr = new int[30][30];
// 0C0은 1이다
arr[0][0] = 1;
for (int i = 1; i < 30; i++) {
for (int j = 0; j < 30; j++) {
if (j == 0) {
arr[i][j] = 1;
continue;
}
if (i == j) {
arr[i][j] = 1;
continue;
}
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
System.out.println(arr[M][N]);
}
}
}