https://www.acmicpc.net/problem/1344

5분에 한번씩 총 90분동안 18번의 슈팅을 할 때, 적어도 한 팀이 소수의 골을 넣을 확률을 구하는 문제이다.
적어도 한 팀이 소수의 골을 넣을 확률은 1 - (두 팀 중 어떤 팀도 소수의 골을 넣지 못할 확률)과 동일한 확률이다.
18 이하의 소수는 2,3,5,7,11,13,17이 있으니
각 소수 prime[i] 에 대해 18Cprime[i] * 골 넣을확률 ^ prime[i] * 골을 넣지 못할 확률 ^ 18 - prime[i] 를 A팀, B팀에 대해 계산한 뒤에 합해주고,
(1 - A팀이 소수 골을 넣을 확률) * (1 - B팀이 소수 골을 넣을 확률)을 계산해 어떤 팀도 소수의 골을 넣지 못할 확률을 계산 후 이 값을 1에서 빼주면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = par(br.readLine());
int b = par(br.readLine());
double ap = (double) a /100;
double bp = (double) b /100;
double app = 0;
double bpp = 0;
long fact = getFact(18);
int[] primes = {2,3,5,7,11,13,17};
for (int temp : primes) {
int rest = 18 - temp;
long getComb = fact/(getFact(rest) * getFact(temp));
double aRate = getComb * Math.pow(ap, temp) * Math.pow(1 - ap, rest);
double bRate = getComb * Math.pow(bp, temp) * Math.pow(1 - bp, rest);
app += aRate;
bpp += bRate;
}
System.out.println(1-(1-app)*(1-bpp));
}
static long getFact(int a){
if(a<=1) return 1L;
return (long)a*getFact(a-1);
}
static int par(String s) {
return Integer.parseInt(s);
}
static int[] getArray(String s) {
return Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).toArray();
}
}'백준' 카테고리의 다른 글
| [JAVA] 백준 1722 - 순열의 순서 (0) | 2025.10.17 |
|---|---|
| [JAVA] 백준 24464 - 득수 밥 먹이기 (0) | 2025.10.17 |
| [JAVA] 백준 1759 - 암호만들기 (0) | 2025.10.14 |
| [JAVA] 백준 12852 - 1로 만들기 2 (0) | 2025.10.10 |
| [JAVA] 백준 11402 - 이항 계수 4 (0) | 2025.10.10 |