fərqli tam ədədi ədədindən seçmək C_n^x üsulla mümkündür.
Gəlin baxaq, minimum elementi olan ədədli neçə fərqə qrupları var. Bunun üçün fərqə mütləq ədəd daxil edilir və x - 1 ədəd seçilir ki, onların hər biri -dən mütləq böyüktür. -dən böyük olan n - i ədəd var və bunlardan x - 1 ədədi seçmək C_{n-i}^{x-1} üsulla mümkündür.
Qeyd edək ki, i + x - 1 \le n qeyri-bərabərliyi təmin olunmalıdır, çünki əgər -dən böyük x - 1 ədəd seçmək mümkün olmur. Bundan i \le n - x + 1 məhdudiyyətini çıxara bilərik.
2^S böyüklüyünün gözlənilən dəyərini hesablamaq üçün bu böyüklüyün bütün mümkün fərqələr üzrə orta çəkili qiymətini tapmalıyıq:
Əgər i > n - x + 1, onda müvafiq fərqələrin sayı 0 qəbul olunur.
Misal
Birinci testdə yeganə seçim mümkündür: \{1, 2, 3, 4\}. Minimum element olduğu üçün axtarılan dəyər 2^1 = 2 bərabərdir.
İkinci testdə üç bərabər ehtimallı seçim var: , və . Müvafiq dəyərləri , və -dir. Belə ki, 2^S böyüklüyünün orta qiyməti
Bu dəyəri formula əsasında hesablayaq:
Algoritmin Reallaşdırılması
Cnk funksiyası binomial əmsalı C_n^k dəyərini hesablamaq üçün istifadə olunur. Binomial əmsalların qiymətləri massivinin hüceyrələrində saxlanacaq.
long long dp[51][51];
long long Cnk(int n, int k)
{
if (n == k) return 1;
if (k == 0) return 1;
if (dp[n][k] != -1) return dp[n][k];
return dp[n][k] = Cnk(n - 1, k - 1) + Cnk(n - 1, k);
}Proqramın əsas hissəsi.
scanf("%d %d", &n, &x);
memset(dp, -1, sizeof(dp));Cavabı hesablamaq üçün: \frac{\sum_{i = 1}^{n - x + 1} 2^i \cdot C_{n - i}^{x - 1}}{C^x_n}.
a = 0;
for (i = 1; i <= n - x + 1; i++)
a = a + Cnk(n - i, x - 1) * (1LL << i);
res = 1.0 * a / Cnk(n, x);Cavabı çıxış edin.
printf("%lf\n", res);