
1. 문제 풀이 아이디어
- 18번의 시도에서 소수 개수만큼 성공할 확률을 제외하여 각각의 실패 확률을 구한 후, 두 확률의 곱을 이용해 전체 실패 확률을 구한다.
- 최종적으로 1에서 전체 실패 확률을 빼서 원하는 확률을 계산한다.
2. 나의 정답 코드
using (StreamReader sr = new StreamReader(Console.OpenStandardInput()))
using (StreamWriter sw = new StreamWriter(Console.OpenStandardOutput()))
{
int[] prime = { 2, 3, 5, 7, 11, 13, 17 };
double a = double.Parse(sr.ReadLine()) / 100.0;
double b = double.Parse(sr.ReadLine()) / 100.0;
double ap = 1;
double bp = 1;
for (int i = 0; i < prime.Length; i++)
{
int cur = prime[i];
ap -= CB(18, cur) * Math.Pow(a, cur) * Math.Pow(1 - a, 18 - cur);
bp -= CB(18, cur) * Math.Pow(b, cur) * Math.Pow(1 - b, 18 - cur);
}
sw.WriteLine(1 - ap * bp);
long CB(int n, int r)
{
long result = 1;
for (int i = 1; i <= r; i++) result = result * (n - r + i) / i;
return result;
}
}
3. 정리
CB(n, r)
함수는 조합(combination) 계산을 수행한다.
ap
와bp
는 각각 특정 횟수만큼 성공하지 않을 확률을 구하는 데 사용된다.
- 최종적으로
1 - ap * bp
를 출력하여 두 경우 중 하나 이상 성공할 확률을 구한다.
Share article