복권 (BOJ 1359)
2025. 1. 30. 21:08ㆍBOJ/DP
문제
문제 설명
1~n의 숫자 중에서 무작위로 m개를 뽑았을 때 k개가 같다면 복권에 당첨된다.
문제 해설
- 기본적으로 조합을 활용해 준다.
- f(n, r)은 조합 공식에서 C(n, r)을 계산한다.
double f(int n, int r){
int x=1, y=1;
while(r){
y *= n, x *= r;
n--, r--;
}
return y/x;
}
- 다음으로 전체 경우의 수를 구해준다.
double x = f(n, m);
- 반복문 k부터 m까지 반복하면서 특정 조건을 만족하는 조합을 구해준다.
while(m >= k){
if(n-m >= m-k) ans += f(m, k) * f(n-m, m-k) / x;
k++;
}
- if (n-m >= m-k) 조건은 가능한 조합인지 체크하는 역할을 한다. 즉, f(m, k) * f(n-m, m-k)가 유효한지 확인해 준다.
최종 코드
#include <ibits/stc++.h>
using namespace std;
int n,m,k;
double ans;
double f(int n,int r){
int x=1, y=1;
while(r){
y*=n,x*=r;
n--,r--;
}
return y/x;
}
int main(){
cin >> n >> m >> k;
double x = f(n,m);
while(m>=k){
if(n-m >= m-k)ans += f(m,k) * f(n-m,m-k)/x;
k++;
}
cout<<fixed<<setprecision(20)<<ans;
}
'BOJ > DP' 카테고리의 다른 글
| 호텔(BOJ 1106) (0) | 2024.12.22 |
|---|---|
| 괄호 추가하기3 (BOJ16639) (0) | 2024.11.25 |
| 성인 게임 (BOJ 23256) (2) | 2024.11.24 |
| 할로윈의 양아치(BOJ20303) (1) | 2024.11.17 |
| 암호코드 (BOJ 2011) (2) | 2024.10.09 |

