Təsəvvür edək ki, oyunçu bütün şarları təsadüfi sırayla bir anda çıxarıb, yəni n = a + b + c şardan təsadüfi bir düzülüş (permutasiya) alınıb. Hansısa rəng ilk dəfə qurtaranda oyun bitir. Deməli, sonuncu şarı düzülüşdə hamıdan tez yerləşən rəng qalib gəlir.
Qızıl cek-potun ehtimalını hesablayaq. Qırmızının qalib gəlməsi üçün cərgənin sonuncu şarı yaşıl və ya mavi olmalıdır. Hər iki halı araşdıraq.
Hal A: Cərgənin sonuncu şarının yaşıl olması ehtimalı -ə bərabərdir ( şardan dənəsi yaşıldır). Yaşıl uduzub. Qırmızı və mavi qalır, kimin qalib gələcəyini anlamaq lazımdır.
Cərgədən yaşıl şarları fikrən atıb yalnız qırmızı və maviyə (onların sayı a + c dənədir) baxaq. Əgər qırmızı və mavi şarların arasında ən sonuncu mavi olarsa, qırmızı qalib gələcək. a + c şardan sonuncunun mavi olması ehtimalı c / (a + c)-ə bərabərdir. Bu şarların hər biri bərabər ehtimalla sonuncu ola bilər, onların arasında isə dənəsi mavidir.
Halının ehtimalı \frac{b}{n} \cdot \frac{c}{a+c}-ə bərabərdir.
Hal B: Cərgənin sonuncu şarının mavi olması ehtimalı -ə bərabərdir ( şardan dənəsi mavidir). Mavi uduzub. Maviləri atıb qırmızı və yaşıla (onların sayı a + b dənədir) baxırıq. Əgər onların arasında sonuncu yaşıl olarsa, qırmızı qalib gələcək, bu ehtimal b / (a + b)-ə bərabərdir.
Halının ehtimalı \frac{c}{n} \cdot \frac{b}{a+b}-ə bərabərdir.
və halları kəsişmir (sonuncu şar eyni zamanda həm yaşıl, həm də mavi ola bilməz), buna görə qırmızının qalib gəlmə ehtimalı belə olacaq:
Analoji olaraq yaşılın qalib gəlmə ehtimalı belədir:
Mavinin qalib gəlmə ehtimalı belədir:
Nümunə
İkinci testə baxaq (a = 1, b = 2, c = 3, n = a + b + c = 6). Cek-potların udma ehtimallarını hesablayaq:
Alqoritmin həyata keçirilməsi
gcd funksiyası və ədədlərinin ən böyük ortaq bölənini hesablayır.
long long gcd(long long a, long long b)
{
return b == 0 ? a : gcd(b, a % b);
}solve funksiyası qırmızının qalib gəlmə ehtimalını hesablayır.
string solve(int a, int b, int c)
{
int n = a + b + c;
int q1 = n * (a + c);
int q2 = n * (a + b);
long long p = (long long)b * c * (q1 + q2);
long long q = (long long)q1 * q2;
long long g = gcd(p, q);
return to_string(p / g) + "/" + to_string(q / g);
}Proqramın əsas hissəsi. Daxil olan məlumatları oxuyuruq.
cin >> a >> b >> c;Cavabı hesablayıb çap edirik. Qeyd edək ki, funksiya çağırışı:
solve(a, b, c) qırmızının qalib gəlmə ehtimalını hesablayır;
solve(b, c, a) yaşılın qalib gəlmə ehtimalını hesablayır;
solve(c, a, b) mavinin qalib gəlmə ehtimalını hesablayır;
cout << solve(a, b, c) << " " << solve(b, c, a) << " "
<< solve(c, a, b) << endl;