M개 중에 중복없이 N개를 고르는 경우의 수 :
해결법은 생각해내기 쉽지만 문제는 수의 범위다.
0<N<=M<=30이기 떄문에
M=30 , N=15일 때 답인 30C15는 long long도 못담는다.
그렇기에 따로 함수를 만들어줘야되는데
큰 수의 표현인 Big integer는 구현이 힘들기 떄문에
그냥 간단한 함수를 만들었다.
30*29*28........*16*15
----------------------
15* 14*13.......*2*1
일때 분모에 있는 15부터 분자로 나누어 0되는 수를 찾은 후 나눈다음 15를 1로 만들어주는 함수.
코드는
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include <stdio.h> #include <iostream> #include<vector> using namespace std; long long ans = 1; vector<int>a; vector<int>b; void check() { for (int i = 0; i < b.size(); i++) { for (int j = 0; j < a.size(); j++) { if (a[j] % b[i] == 0 && b[i]!=1) { a[j] = a[j] / b[i]; b[i] = 1; break; } } } long long up=1; long long down=1; for (int i = 0; i < a.size(); i++) { up = up * a[i]; } for (int i = 0; i < b.size(); i++) { down = down * b[i]; } ans = up / down; } int main() { //freopen("Text.txt", "r", stdin); int testcase; cin >> testcase; while (testcase--) { int n, m; cin >> n >> m; int c; c = n; if (n == 0 || m == 0) { ans = 0; } else { for (int i = 0; i < n; i++) { a.push_back(m); m--; } for (int i = 0; i < n; i++) { b.push_back(c); c--; } check(); } cout << ans << endl; a.clear(); b.clear(); ans = 1; } } |
테스트케이스가 여러번이기 때문에 테스트가 끝난 후 초기화시켜주는 걸 잊지말자.
'BOJ' 카테고리의 다른 글
백준 1012 / 유기농 배추 (0) | 2018.12.31 |
---|---|
백준 1389 / 케빈 베이컨의 6단계 법칙 (0) | 2018.12.30 |
백준 2225 / 합분해 (0) | 2018.12.29 |
백준 1699 / 제곱수의 합 (0) | 2018.12.29 |
백준 1912 / 연속합 (0) | 2018.12.28 |