əks hadisəsinin ehtimalını hesablayaq — yəni sonuncu çıxarılan şarların müxtəlif rəngdə olması hadisəsini. Bunun üçün ilk n - 2 çıxarılan şarın düz yarısı ağ, digər yarısı isə qara olmalıdır.
Bernulli sınaq sxemini nəzərdən keçirək, burada uğur ehtimalı (məsələn, ağ şarın çıxması) p = 1/2-ə, uğursuzluq ehtimalı isə q = 1 - p = 1/2-ə bərabərdir. Çıxarılan n - 2 şarın arasında dəqiq (n - 2) / 2 ağ şarın olması ehtimalı aşağıdakı düstur ilə hesablanır:
Hər daxil edilən üçün qiymətini hesablamaq və 1 - P(X)-i çap etmək qalır.
-dan -ə qədər (daxil olmaqla) hüdudlarda olsa da, onun birbaşa hesablanması ədədi problemlərə səbəb ola bilər. Bundan qaçmaq üçün loqarifmi hesablayaq:
Bərabərliyin sağ tərəfini hesabladıqdan sonra -i bərpa etmək üçün -ni alınan qiymətə qaldıraq. Faktorialın loqarifmini loqarifmlərin cəmi kimi hesablayaq:
Proqramın girişinə bir neçə test veriləcəyi üçün bütün cavabları əvvəlcədən hesablayıb massivdə saxlamaq lazımdır.
Misal
n = 6 üçün sonuncu çıxarılan şarların müxtəlif rəngdə olması ehtimalı belədir:
Sonuncu çıxarılan şarların eyni rəngdə olması ehtimalı isə belədir:
Alqoritmin reallaşdırılması
Lazımi massivləri elan edək. xanasında C_{i-2}^{i/2-1} p^{i/2 - 1} q^{i/2 - 1} qiymətini saxlayacağıq.
#define MAX 100001
double lf[MAX], ans[MAX];massivini dolduraq, burada qiymətini saxlayır.
res = lf[1] = 0.0;
for (res = 0, i = 2; i < MAX; i++)
{
res += log((double)i);
lf[i] = res;
}Hər qiyməti üçün ln~C_{i-2}^{i/2-1} p^{i/2 - 1} q^{i/2 - 1} hesablayaq və nəticəni -də saxlayaq.
for (i = 2; i < MAX; i += 2)
{
res = lf[i/2-1];
res = lf[i-2] - (i - 2) * log(2.0) – res - res;
ans[i] = exp(res);
}Hər daxil edilən qiyməti üçün cavabı hesablayıb çap edirik.
while (scanf("%d",&n) == 1)
printf("%.8lf\n",1 - ans[n]);