#include <stdio.h>
#include <math.h>

// 팩토리얼 계산 함수
unsigned long long factorial(int num) {
    if (num == 0 || num == 1) return 1;
    unsigned long long result = 1;
    for (int i = 2; i <= num; i++) {
        result *= i;
    }
    return result;
}

// 이항 계수 계산 함수
unsigned long long binomial_coefficient(int n, int k) {
    if (k > n) return 0;
    return factorial(n) / (factorial(k) * factorial(n - k));
}

// 이항 분포 확률 계산 함수
double binomial_probability(int n, int k, double p) {
    double coefficient = binomial_coefficient(n, k);
    return coefficient * pow(p, k) * pow(1 - p, n - k);
}

// m개 이상 성공할 확률 계산 함수
double probability_at_least_m(int n, int m, double p) {
    double probability = 0.0;
    for (int k = m; k <= n; k++) {
        probability += binomial_probability(n, k, p);
    }
    return probability;
}

int main() {
    int n; // 뽑기 횟수
    double p; // 뽑기 확률
    int m; // 최소 성공 횟수

    // 사용자 입력
    printf("뽑기 횟수(n)를 입력하세요: ");
    scanf("%d", &n);
    printf("성공 확률(p)을 입력하세요 (0과 1 사이의 값): ");
    scanf("%lf", &p);
    printf("최소 성공 횟수(m)를 입력하세요: ");
    scanf("%d", &m);

    // 입력값 유효성 검사
    if (n < 0 || p < 0.0 || p > 1.0 || m < 0 || m > n) {
        printf("잘못된 입력입니다. 뽑기 횟수는 0 이상의 정수여야 하고, 성공 확률은 0과 1 사이의 값이어야 하며, 최소 성공 횟수는 0에서 뽑기 횟수 사이여야 합니다.\n");
        return 1;
    }

    // m개 이상 성공할 확률 계산 및 출력
    double probability = probability_at_least_m(n, m, p);
    printf("%d번 뽑기에서 %d개 이상 성공할 확률: %.4f\n", n, m, probability);

    return 0;
}
