1) 1 - (1 - A 성공) * ( 1 - B 성공))
2) n번 독립시행확률:
nCr (성공확률)^r (1-성공확률)^(n-r)
3) dp
4) %f: 여섯번째자리까지 = %.6f
cout은 안됨
/*
5분에 하나의 가구
완제품: 결함X
두명 가구 장인 시합
각 장인 완제품 개수: 소수개수 인가
pa = (5분안 완제품 만들 확률)
pb = (5분안 완제품 만들 확률)
총 시간 90분 = 최소 2개 최대 36개
한 장인: 최소 0개 최대 18개
n: 18번 시도 , r: (0~18)중 소수가 아닌 수
적어도 둘 중 한명이라도 소수개 만들 확률 = 1 - (둘다 소수가 아닐 확률)
장인a: 18Cr * (pa)^r * (1-pa)^(18 - r)
장인b: 18Cr * (pb)^r * (1-pb)^(18 - r)
*/
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#define NMAX 11
#define diff (1e-12)
using namespace std;
double pa; double pb;
vector<int> numbers = { 0, 1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18 };
int dp[19][19];
vector<int> comb(19);
int comb_cal(int n, int r) {
if (r == 0 || n == r) return 1;
//0이면
if (!dp[n][r]) return dp[n][r] = comb_cal(n - 1, r) + comb_cal(n - 1, r - 1);
return dp[n][r];
}
int main(int argc, char** argv)
{
int test_case;
int T;
//freopen("input.txt", "r", stdin);
cin >> T;
//조합: 18C숫자 계산 미리 해두기
for (int& r : numbers) {
comb[r] = (comb_cal(18, r));
//cout << comb[r] << endl;
}
for (test_case = 1; test_case <= T; ++test_case)
{
int a, b;
cin >> a >> b;
cout << "#" << test_case << " ";
if ((!a) && (!b)) {
printf("%.6lf\n", 0.0);
continue;
}
pa = (double)a / 100; pb = (double)b / 100;
double sum_a = 0;
double sum_b = 0;
//cout << "pa: " << pa << " pb: " << pb << endl;
if (pa == 0) {
for (int& r : numbers) {
sum_b += (comb[r] * pow(pb, r) * pow((1-pb), (18 - r)));
}
printf("%.6lf\n", (1 - sum_b));
continue;
}
else if (pb == 0) {
for (int& r : numbers) {
sum_a += (comb[r] * pow(pa, r) * pow((1-pa), (18 - r)));
}
printf("%.6lf\n", (1 - sum_a));
continue;
}
else {
for (int& r : numbers) {
//cout << (comb[r] * (float)pow(pb, r) * (float)pow((1-pb), (18 - r))) << endl;
sum_a += (comb[r] * (float)pow(pa, r) * (float)pow((1-pa), (18 - r)));
sum_b += (comb[r] * (float)pow(pb, r) * (float)pow((1-pb), (18 - r)));
}
printf("%.6lf\n", (1 - (sum_a * sum_b)));
}
}
return 0;//정상종료시 반드시 0을 리턴해야합니다.
}