Basecamp
    Ana Səhifə
    Problemlər
    Müsabiqələr
    Kurslar
    Reytinq
    Postlar
    Mağaza
    Discord
Binomial əmsalı
Daxil ol
medv
•Article•1 il öncə

Binomial əmsalı

Seçim n elementdən k elementin seçilməsidir, burada verilmiş n elementdən k elementi seçilir. Bu halda, elementlərin sıralanması fərqli olan dəstlər (lakin tərkibi fərqli olmayan) eyni hesab olunur. Seçimlərin bu xüsusiyyətinə görə onlar yerləşdirmələrdən fərqlənirlər.

Məsələn, 5 elementdən ibarət olan çoxluğu nəzərdən keçirək: {1,2,3,4,5}. {2,1,3} və {3,2,1} dəstləri seçim olaraq eyni hesab olunur (yerdəyişmə olaraq fərqli olsalar da), çünki eyni elementlərdən {1,2,3} ibarətdir.

n-dən k-yə qədər seçimlərin sayının hesablanması üçün formula belədir

Cnk​=k!⋅(n−k)!n!​

Cnk​ ədədləri binomial əmsallar adlanır.

Nümunə

Cn0​=1

n elementdən ibarət olan çoxluqdan sıfır element seçdiyimiz zaman əslində "boş" seçim edirik. Bu kontekstdə boş çoxluq düzgün seçim hesab olunur. Təsəvvür edin ki, n topları olan bir qutunuz var və onlardan 0 ədədini seçmək istəyirsiniz. Heç bir şey seçməsəniz belə, bu yenə də düzgün seçim variantıdır. Beləliklə, Cn0​ n-dən 0 element seçmənin sayını bildirir ki, bu da 1-ə bərabərdir.

Bunu heç bir element seçməmək üçün yalnız bir yol kimi nəzərə ala bilərik ki, bu da nəticədə 1 verir.

Cn0​=0!⋅(n−0)!n!​=1!⋅n!n!​=1
Nümunə

Cn1​=n

n elementdən ibarət olan çoxluqdan bir element seçdiyimiz zaman n seçmə variantımız var: n elementdən istənilən birini seçə bilərik. Məsələn, 1-dən 5-ə qədər ədədlərdən ibarət olan çoxluqdan ({1,2,3,4,5}) bir ədəd seçsək, bu çoxluqdan bir ədəd seçmək üçün 5 variantımız var.

Cn1​-in dəyəri n-ə bərabərdir, çünki n elementdən ibarət olan çoxluqdan bir elementi seçmənin n yolu var.

Cn1​=1!⋅(n−1)!n!​=n
Nümunə

Cn2​=2n⋅(n−1)​

n elementdən ibarət olan çoxluqdan 2 element seçdiyimiz zaman cütlüklər təşkil edirik. Belə bir cütlüyün qurulması üçün əvvəlcə bir elementi, sonra isə ikinci elementi seçirik.

  • Birinci elementi n elementdən seçə bilərik.

  • Birinci elementi seçdikdən sonra ikinci elementi seçmək üçün n–1 element qalır (çünki eyni elementi təkrarən seçə bilmərik).

Beləliklə, n elementdən ibarət olan çoxluqdan cüt elementlərin seçilmə üsullarının ümumi sayı birinci və ikinci elementləri seçmənin yollarının hasilinə bərabərdir: n⋅(n–1).

Lakin, hər bir cütlük iki dəfə sayılır, çünki cütlükdə elementlərin sırası əhəmiyyət daşımır. Məsələn, (p,q) və (q,p) eyni cütlük hesab olunur. Bunu nəzərə alaraq, cütlüklərin ümumi sayını 2-yə bölmək lazımdır. Beləliklə, Cn2​ n⋅(n–1)/2-yə bərabərdir.

Cn2​=2!⋅(n−2)!n!​=2n⋅(n−1)​
Nümunə

Aşağıdakı binomial əmsalların qiymətlərini hesablayın:

C42​=2!⋅2!4!​=23⋅4​=6,
C63​=3!⋅3!6!​=64⋅5⋅6​=20,
C73​=3!⋅4!7!​=65⋅6⋅7​=35

Simmetriya xüsusiyyəti: Cnk​=Cnn−k​.

n elementdən k elementi seçmənin sayı n elementdən (n–k) elementi seçmənin sayına bərabərdir. Amma n elementdən (n–k) elementi seçmənin Cnn−k​ yolu var. Deməli, Cnk​=Cnn−k​.

Nümunə

Aşağıdakı binomial əmsalların qiymətlərini hesablayın:

C54​=C55−4​=C51​=5,
C64​=C66−4​=C62​=26⋅5​=15

Tapşırıq. Aşağıdakı binomial əmsalların qiymətlərini hesablayın:

1) C52​

3) C54​

5) C81​

2) C83​

4) C75​

6) C85​

Yığma formulu: Cnk​=Cn−1k−1​+Cn−1k​.

İspat. Bərabərliyin sağ tərəfindəki dəyəri hesablayın:

Cn−1k−1​+Cn−1k​=(k−1)!⋅(n−k)!(n−1)!​+k!⋅(n−k−1)!(n−1)!​=
k!⋅(n−k)!(n−1)!⋅k+(n−1)!⋅(n−k)​=k!⋅(n−k)!(n−1)!⋅(k+n−k)​=k!⋅(n−k)!n!​=Cnk​
Eolymp #3260. Neçə?

Riyazi analiz imtahanına hazırlaşarkən, Petyanın qarşısında n müxtəlif yazıqlar var idi. Onlar onun xilas yolu idi, çünki bütün semestr boyunca Petya materialı düzgün öyr

ənməyə cəhd etməmişdi. Yazıqlar o qədər çox idi ki, onlar heç bir cibə yerləşmirdi. Buna görə Petya imtahana öz ilə götürə biləcəyi maksimum yazıq sayını hesablamağa qərar verdi. Və burada bir sual meydana çıxdı: ümumiyyətlə lazımi yazıqların sayını seçmənin neçə yolu var?

Giriş məlumatları. Ümumi yazıq sayı n (1≤n≤12) və Petyanın özü ilə götürə biləcəyi yazıq sayı k (0≤k≤n) verilmişdir.

Çıxış məlumatları. n yazıqdan k yazıq seçmənin yollarının sayını çıxarın.

Giriş məlumatları 1
3 2
Çıxış məlumatları 1
3
Giriş məlumatları 2
4 1
Çıxış məlumatları 2
4
Məsələni aç
Həll - iterativ metod

Binomial əmsalın hesablanması üçün aşağıdakı nisbətdən istifadə edə bilərsiniz:

Cnk​=k!⋅(n−k)!n!​=1⋅2⋅3⋅...⋅kn⋅(n−1)⋅(n−2)⋅...⋅(n−k+1)​

1 qiyməti ilə dəyişən res təyin edin. Sonra res-i n-ə vurun və nəticəni 1-ə bölün. Sonra res-i n–1-ə vurun və 2-yə bölün. Çoxaltma və bölmə prosesini k dəfə davam etdirin (Cnk​-nin payı və məxrəci (n–k)! ilə qısaldıqdan sonra k vurucu ehtiva edir).

Alqoritmin tətbiqi - iterativ metod

Cnk funksiyası binomial əmsalın qiymətini iterativ metodla hesablayır.

int Cnk(int n, int k)
{
  int res = 1;
  for(int i = 1; i <= k; i++)
    res = res * (n - i + 1) / i;
  return res;
}
C++
7 lines
118 bytes

Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.

scanf("%d %d",&n,&k);

Cavabı hesablayın və çıxarın.

res = Cnk(n,k);
printf("%d\n",res);
Həll - rekursiv metod

Binomial əmsalın rekursiv tətbiqi üçün aşağıdakı nisbətdən istifadə edə bilərsiniz:

Cnk​={Cn−1k−1​+Cn−1k​,n>01,k=n və ya k=0​
Alqoritmin tətbiqi - rekursiv metod

Cnk funksiyası binomial əmsalın qiymətini rekursiv metodla hesablayır.

int Cnk(int n, int k)
{
  if (n == k) return 1;
  if (k == 0) return 1;
  return Cnk(n - 1, k - 1) + Cnk(n - 1, k);
}

Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.

scanf("%d %d",&n,&k);

Cavabı hesablayın və çıxarın.

res = Cnk(n,k);
printf("%d\n",res);
Eolymp #5329. Axşam

n LKS-lər arasında neçə nəfər kefir alacağını seçmək üçün neçə yol var? Cavabı 9929-a bərabər olaraq çıxarın.

Giriş məlumatları. n və k (0≤k≤n≤500) tam ədədləri.

Çıxış məlumatları. Cavabı 9929-a bərabər olaraq çıxarın.

Giriş məlumatları 1
6 3
Çıxış məlumatları 1
20
Məsələni aç
Həll

Məsələnin cavabı Cnk​ mod 9929-a bərabər olacaq. Bərabərliyin hesablanması zamanı bölmədən qaçmaq üçün Cnk​=Cn−1k​+Cn−1k−1​,Cn0​=1 nisbətindən istifadə edəcəyik.

k≤n≤500 olduğuna görə, memorizasiya texnikasından istifadə edəcəyik.

Alqoritmin tətbiqi

Sabitləri və cnk massivini elan edək, burada cnk[n][k]=Cnk​ mod 9929.

#define MAX 510
#define MOD 9929
int cnk[MAX][MAX];

c funksiyası Cnk​ mod 9929 binomial əmsalın qiymətini hesablayır.

int c(int n, int k)
{
  if (cnk[n][k] > 0) return cnk[n][k];
  if (n - k < k) return c(n,n-k);
  if (!k) return cnk[n][k] = 1;
  return cnk[n][k] = (c(n-1,k) + c(n-1,k-1)) % MOD;
}
C++
7 lines
181 bytes

Proqramın əsas hissəsi. cnk massivini sıfırla yükləyin. Giriş məlumatlarını oxuyun.

memset(cnk,0,sizeof(cnk));
scanf("%d %d",&n,&k);

Cavabı hesablayın və çıxarın.

printf("%d\n",c(n,k));

Binomial əmsallar Nyuton binomunda görünür:

(x+y)n=k=0∑n​Cnk​xkyn−k

Nümunələri nəzərdən keçirək:

(x+y)2=C20​x2y0+C21​x1y1+C22​x0y2=x2+2xy+y2,
(x+y)3=C30​x3y0+C31​x2y1+C32​x1y2+C33​x0y3=x3+3x2y+3xy2+y3
Eolymp #9892. C0n + ... + Cnn

Verilmiş qeyri-mənfi tam ədəd n üçün binomial əmsalların cəmini tapın

Cn0​+Cn1​+...+Cnn​

Giriş məlumatları. Bir qeyri-mənfi tam ədəd n (n≤60).

Çıxış məlumatları. Cəmin qiymətini çıxarın.

Giriş məlumatları
2
Çıxış məlumatları
4
Məsələni aç
Həll

Nyuton binomu formulu belədir:

(a+b)n=i=0∑n​Cni​aibn−i

a=b=1 qiymətini verərsək, bu əlaqə belə görünür:

(1+1)n=i=0∑n​Cni​1i1n−i

və ya

2n=i=0∑n​Cni​=Cn0​+Cn1​+...+Cnn​

Beləliklə, göstərilən cəm 2n-ə bərabərdir.

Nümunə

n=1 üçün: C10​+C11​=1+1=2

n=2 üçün: C20​+C21​+C22​=1+2+1=4

n=3 üçün: C30​+C31​+C32​+C33​=1+3+3+1=8

Alqoritmin tətbiqi

Giriş dəyəri n-i oxuyun.

scanf("%lld", &n);

Cavabı hesablayın və çıxarın — 2n qiyməti.

res = 1LL << n;
printf("%lld\n", res);
Eolymp #11271. Cnk kvadratlarının cəmi

Verilmiş qeyri-mənfi tam ədəd n üçün binomial əmsalların kvadratlarının cəmini tapın

(Cn0​)2+(Cn1​)2+(Cn2​)2+...+(Cnn​)2

Giriş məlumatları. Bir qeyri-mənfi tam ədəd n (n≤30).

Çıxış məlumatları. Cəmin qiymətini çıxarın.

Giriş məlumatları
3
Çıxış məlumatları
20
Məsələni aç
Həll

2n obyektlərindən a1​,...,a2n​-i nəzərdən keçirək və 2n obyektlərindən n obyektini seçmənin sayını tapın.

Çoxluğu iki hissəyə bölək: {a1​,a2​,...,an​,an+1​,...,a2n​}. 2n obyektlərindən n obyektini seçmək üçün, sol yarıdan (yəni {a1​,a2​,...,an​} çoxluğundan) k (k≤n) obyektini və sağ yarıdan n–k obyektini seçmək lazımdır (yəni {an+1​,an+2​,...,a2n​} çoxluğundan). Bu seçimi etmənin yollarının sayı vurma qaydasına görə Cnk​⋅Cnn−k​=(Cnk​)2-ə bərabərdir. k 0-dan n-ə qədər dəyişə bildiyi üçün ∑k=0n​(Cnk​)2 2n-dən n-ə qədər seçmənin yollarının sayına bərabərdir, yəni C2nn​. Beləliklə

(Cn0​)2+(Cn1​)2+(Cn2​)2+...+(Cnn​)2=C2nn​

Nümunə

n=3 üçün cavab belədir: (C30​)2+(C31​)2+(C32​)2+(C33​)2=12+32+32+12=20

Eyni zamanda C63​=3!⋅3!6!​=64⋅5⋅6​=20.

Alqoritmin tətbiqi

Cnk funksiyası Cnk​ binomial əmsalının qiymətini hesablayır.

long long Cnk(long long n, long long k)
{
  long long res = 1;
  if (k > n - k) k = n - k;
  for (long long i = 1; i <= k; i++)
    res = res * (n - i + 1) / i;
  return res;
}
C++
8 lines
177 bytes

Proqramın əsas hissəsi. Giriş dəyəri n-i oxuyun.

scanf("%lld", &n);

Cavabı hesablayın və çıxarın.

res = Cnk(2*n, n);
printf("%lld\n", res);
Eolymp #11550. x1 + x2 + ... + xk = n

Verilmiş k və n dəyərlərinə görə aşağıdakı tənliyin natural həllərinin sayını tapın

x1​+x2​+...+xk​=n

Giriş məlumatları. İki natural ədəd k və n (k≤n≤100).

Çıxış məlumatları. Verilmiş tənlik üçün natural həllərin sayını çıxarın. Məlumdur ki, cavab 1018-i keçmir.

Giriş məlumatları
3 4
Çıxış məlumatları


3
Məsələni aç
Həll

n vahidlərindən ibarət olan ardıcıllığı nəzərdən keçirək: 111...11. İki vahid arasında '+' işarəsini qoymaq olar. Məsələn, 11+111+1. Bu yazı 2+3+1 cəmini ifadə edəcək, burada hər bir sətir yandakı vahidlərin sayıdır. '+' işarəsini qoymaq üçün mövqelərin sayı n–1-ə bərabərdir. Çünki k sətirlərini əldə etmək üçün k–1 '+' işarəsini qoymaq lazımdır.

n–1 mövqeyində k–1 plüs işarəsini qoymaq Cn−1k−1​ yolla mümkündür.

Nümunə

x1​+x2​+x3​=4 tənliyinin üç təbii tam həlli var:

  • (1,1,2)

  • (1,2,1)

  • (2,1,1)

Məsələn, n=4 vahidləri k=3 sətirlərə C23​=3 yolla bölmək olar:

Alqoritmin tətbiqi

Cnk funksiyası Cnk​ binomial əmsalının qiymətini hesablayır.

long long Cnk(long long k, long long n)
{
  long long res = 1;
  if (k > n - k) k = n - k;
  for (long long i = 1; i <= k; i++)
    res = res * (n - i + 1) / i;
  return res;
}
C++
8 lines
177 bytes

Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.

scanf("%lld %lld", &k, &n);

Cn−1k−1​ cavabını hesablayın və çıxarın.

res = Cnk(k - 1, n - 1);
printf("%lld\n", res);
Eolymp #11551. x1+...+xk = n (2)

Verilmiş k və n dəyərlərinə görə aşağıdakı tənliyin qeyri-mənfi tam ədəd həllərinin sayını tapın

x1​+x2​+...+xk​=n

Giriş məlumatları. İki natural ədəd k və n (k≤n≤100).

Çıxış məlumatları. Verilmiş tənlik üçün qeyri-mənfi tam ədəd həllərinin sayını çıxarın. Məlumdur ki, cavab 1018-i keçmir.

Giriş məlumatları
3 4
Çıxış məlumatları
15
Məsələni aç
Həll

n+k–1 mövqelərindən ibarət ardıcıllığı nəzərdən keçirək. n mövqeyində 1 qoyulmalıdır. k–1 mövqeyində '+' işarəsi qoyulmalıdır (yəni k sətir almaq üçün).

Hər hansı bir yerdə ədədlər və '+' işarələri yerləşdirilməsi verilmiş tənliyin həllinə uyğun gələcək. Məsələn, x1​+x2​+x3​=4 tənliyinin bəzi həlləri aşağıdakılardır (4 vahid və 2 plüs):

k–1 plüs işarəsini n+k–1 mövqeyinə qoymaq Cn+k−1k−1​ yolla mümkündür.

Nümunə

x1​+x2​+x3​=4 tənliyinin həlləri aşağıdakılardır:

  • (4,0,0) və onun 3 dəyişməsi

  • (3,1,0) və onun 6 dəyişməsi

  • (2,2,0) və onun 3 dəyişməsi

  • (2,1,1) və onun 3 dəyişməsi

Ümumilikdə 3+6+3+3=15 həll var.

Alqoritmin tətbiqi

Cnk funksiyası Cnk​ binomial əmsalının qiymətini hesablayır.

long long Cnk(long long k, long long n)
{
  long long res = 1;
  if (k > n - k) k = n - k;
  for (long long i = 1; i <= k; i++)
    res = res * (n - i + 1) / i;
  return res;
}
C++
8 lines
177 bytes

Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.

scanf("%lld %lld", &k, &n);

Cn+k−1k−1​ cavabını hesablayın və çıxarın.

res = Cnk(k - 1, n + k - 1); 
printf("%lld\n", res);
Eolymp #318. Binomial əmsallar 1

n qeyri-mənfi tam ədəd olsun. Göstərək ki,

n!=1⋅2⋅...⋅n (0!=1),
Cnk​=k!⋅(n−k)!n!​(0≤k≤n)

Verilmiş n və k üçün Cnk​-nin qiymətini hesablayın.

Giriş məlumatları. Birinci sətir testlərin sayını t (t≤50) ehtiva edir. Növbəti t sətirin hər biri iki tam ədəd n və k (0≤n<264,0≤Cnk​<264) ehtiva edir.

Çıxış məlumatları. Hər bir test üçün Cnk​ dəyərini ehtiva edən t sətir çıxışa verin.

Giriş məlumatları
6
0 0
1 0
1 1
2 0
2 1
2 2
7 lines
26 bytes
Çıxış məlumatları
1
1
1
1
2
1
Məsələni aç
Həll

Hesablamalar 64 bitlik işarəsiz tam ədədlərdən (unsigned long long) istifadə edilərək aparılacaq. Aydındır ki,

Cnk​=k!⋅(n−k)!n!​=1⋅2⋅3⋅...⋅kn⋅(n−1)⋅(n−2)⋅...⋅(n−k+1)​=1n​⋅2n−1​⋅n−2⋅3⋅...⋅kn−k+1​

Dəyişən res-ə 1 qiyməti verin, sonra isə onu i=1-dən k-yə qədər bütün n−i+1/i-ə vurun. Hər dəfə bölmə tam ədədli olacaq, lakin vurma zamanı yüklənmə baş verə bilər. d=resvəi−ninənbo¨yu¨kortaqbo¨ləni olsun. Onda əməliyyat

res=res∗(n–i+1)/i

aşağıdakı kimi yazılsın

res=(res/d)∗((n–i+1)/(i/d))

Bu tətbiqlə vurma zamanı yüklənmə baş verməyəcək (cavab 64 bitlik işarəsiz tam ədəddir). Əvvəlcə (n–i+1)/(i/d) bölməsini, sonra isə res/d-i əldə edilmiş qismətə vurmağı unutmayın.

Cnk​-nı hesablamaq üçün k iterasiya yerinə yetirmək lazımdır. Lakin C20000000001999999999​-u hesablamaq lazım gələrsə nə etməli? Cavab 264-ü keçməyəcək, ona görə də belə giriş məlumatları mümkündür. Cnk​=Cnn−k​ olduğuna görə n–k<k olduqda k=n–k qəbul edilməlidir.

Nümunə

Aşağıdakı nümunəni nəzərdən keçirək:

C63​=16​⋅25​⋅34​=15⋅34​

15∗34​ vurması qalıb. d=15və3−u¨nənbo¨yu¨kortaqbo¨ləni=3. Buna görə 15⋅34​=(15/3)⋅3/34​=5⋅14​=20.

Alqoritmin tətbiqi

gcd funksiyası a və b ədədlərinin ən böyük ortaq bölənini hesablayır.

unsigned long long gcd(unsigned long long a, unsigned long long b)
{
  return (!b) ? a : gcd(b,a % b);
}

Cnk funksiyası binomial əmsalın qiymətini hesablayır.

unsigned long long Cnk(unsigned long long n, unsigned long long k)
{
  unsigned long long CnkRes = 1, t, i;
  if (k > n - k) k = n - k;
  for(i = 1; i <= k; i++)
  {

Növbəti iterasiyada nəticə m-i keçərsə (məsələni həll etmək üçün Cnk​=m tənliyini axtarırıq), dayanırıq. Bu funksiyadan çıxmaqla yüklənmədən də qaçırıq.

    if (1.0 * Res * (n - i + 1) / i > m) return m + 1;
    Res = Res * (n - i + 1) / i;
  }
  return Res;
}

Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.

scanf("%d",&t);
while(t--)
{
  scanf("%llu %llu",&n,&k);
  res = Cnk(n,k);
  printf("%llu\n",res);
}
C++
7 lines
101 bytes
Eolymp #11488. Binomial cəm

Verilmiş natural ədəd n. Aşağıdakı cəmin qiymətini tapın

1⋅Cn0​+2⋅Cn1​+3⋅Cn2​+...+(n+1)⋅Cnn​

Giriş məlumatları. Bir natural ədəd n(n≤30).

Çıxış məlumatları. Axtarılan cəmin qiymətini çıxarın.

Giriş məlumatları
3
Çıxış məlumatları
20
Məsələni aç
Həll

Verilmiş cəmi aşağıdakı kimi yazın:

1⋅Cn0​+2⋅Cn1​+3⋅Cn2​+...+(n+1)⋅Cnn​=
(Cn0​+Cn1​+Cn2​+...+Cnn​)+1⋅Cn1​+2⋅Cn2​+...+n⋅Cnn​

Qövslərdə olan cəm 2n-ə bərabərdir. Nyuton binomu formulasında

(a+b)n=i=0∑n​Cni​aibn−i

a=b=1 qəbul edildikdə, əlaqə belə görünəcək: (1+1)n=∑i=0n​Cni​1i1n−i, və ya

2n=i=0∑n​Cni​=Cn0​+Cn1​+...+Cnn​

Qalan cəmi hesablayın:

1⋅Cn1​+2⋅Cn2​+...+n⋅Cnn​=
1⋅1!⋅(n−1)!n!​+2⋅2!⋅(n−2)!n!​+...+n⋅n!⋅(n−n)!n!​=
n⋅(0!⋅(n−1)!(n−1)!​+1!⋅(n−2)!(n−1)!​+...+(n−1)!⋅(n−n)!(n−1)!​)=
n⋅(Cn−10​+Cn−11​+...+Cn−1n−1​)=n⋅2n−1

Beləliklə, cavab 2n+n⋅2n−1=(n+2)⋅2n−1-ə bərabərdir.

Nümunə

n=3 üçün cavabı hesablayaq. Düzgün hesablama ilə:

1⋅C30​+2⋅C31​+3⋅C32​+4⋅C33​=1⋅1+2⋅3+3⋅3+4⋅1=1+6+9+4=20

Formula ilə hesablama zamanı: 5⋅22=20.

Alqoritmin tətbiqi

Giriş dəyəri n-i oxuyun.

scanf("%lld", &n);

Cavabı hesablayın və çıxarın.

res = (1LL << (n - 1)) * (n + 2);
printf("%lld\n", res);

Alqoritmin tətbiqi – funksiya

Nəticələri yadda saxlamaq üçün massiv təyin edin: dp[n][k]=Cnk​.

int dp[31][31];

Cnk funksiyası Cnk​ binomial əmsalının qiymətini hesablayır.

int 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)) % 9929;
}
C++
7 lines
177 bytes

Proqramın əsas hissəsi. Giriş dəyəri n-i oxuyun.

scanf("%d", &n);
memset(dp, -1, sizeof(dp));

Göstərilən cəmi hesablayın.

res = 0;
for (i = 0; i <= n; i++)
  res += (i + 1) * Cnk(n, i);

Cavabı çıxarın.

printf("%d\n", res);
Eolymp #10668. Şəbəkə üzərində yollar

Sizdə bir parça kağız var və onda n⋅m ölçüsündə düzbucaqlı seçirsiniz. Bu düzbucaqlını, onun üzərində yerləşən xətlər ilə birlikdə, şəbəkə adlandıraq. Şəbəkənin sol alt küncündən başlayaraq, karandaşınızı sağ üst küncə hərəkət etdirirsiniz, xətlər üzərində qalaraq yalnız sağa və ya yuxarı hərəkət edirsiniz. Nəticə solda göstərilmişdir:

Həqiqətən bir şah əsər deyilmi? Proseduru yenidən təkrarlayaraq, sağda göstərilmiş şəkildə nəticə əldə edəcəksiniz. İndi isə sual yaranır: bu üsulla neçə fərqli sənət əsəri yaratmaq olar?

Giriş məlumatları. İki təbii ədəd n və m.

Çıxış məlumatları. Yuxarıda təsvir olunan prosedurdan istifadə edərək yaratmaq mümkün olan müxtəlif sənət əsərlərinin sayını çıxarın. Bu sayın 64 bitlik işarəli tam ədədə uyğun gəldiyini deyə bilərik.

Giriş məlumatları 1
3 4
Çıxış məlumatları 1
35
Giriş məlumatları 2
1 1
Çıxış məlumatları 2
2
Məsələni aç
Həll

Axtarılan yol n+m seqmentindən ibarət bir ziqzaqdır. Onlardan n seqmentləri şaquli, qalanları isə üfüqi olmalıdır. n şaquli seqmentləri n+m-dən seçməyin yollarının sayı Cn+mn​-ə bərabərdir.

Nümunə

Birinci nümunə üçün n=3,m=4. Cavab C73​=3!⋅4!7!​=1⋅2⋅37⋅6⋅5​=35-ə bərabərdir.

İkinci nümunə üçün n=1,m=1. Cavab C21​=1!⋅1!2!​=2-ə bərabərdir.

Alqoritmin tətbiqi

Cnk funksiyası binomial əmsalın qiymətini hesablayır.

long long Cnk(long long n, long long k)
{
  long long res = 1;
  if (k > n - k) k = n - k;
  for (long long i = 1; i <= k; i++)
    res = res * (n - i + 1) / i;
  return res;
}
C++
8 lines
177 bytes

Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.

scanf("%lld %lld", &n, &m);

Cn+mn​ cavabını hesablayın və çıxarın.

res = Cnk(n + m, n);
printf("%lld\n", res);
Eolymp #4008. Binomial əmsallar

Gunnar kifayət qədər yaşlı və unutqan bir tədqiqatçıdır. Hazırda o, sosial şəbəkələrdə təhlükəsizlik mövzusunda məqalə yazır və bu məqalədə bəzi kombinatorika elementləri də yer alır. O, bəzi hesablamaları yoxlamaq üçün binomial əmsalların hesablanması üçün proqram yazıb.

Binomial əmsal Cnk​ bu ədəddir

Cnk​=k!⋅(n−k)!n!​

n və k qeyri-mənfi ədədlərdir.

Gunnar proqramından istifadə edərək Cnk​-ni hesablayıb və nəticədə m ədədini alıb. Təəssüf ki, unutqan olduğuna görə, o, giriş kimi istifadə etdiyi n və k ədədlərini unudub. Bu iki ədəd uzun hesablamaların nəticəsi idi və onlar masasının üzərində olan çoxsaylı kağızlardan birində yazılmışdı. Kağızlarda axtarmaq əvəzinə, o, alınan cavabdan n və k ədədlərini bərpa etməyə qərar verdi. Ona bütün mümkün qiymətləri tapmaqda kömək edə bilərsinizmi?

Giriş məlumatları. Birinci sətir testlərin sayını, ən çox 100, ehtiva edir. Hər test bir sətirdə verilir və Gunnarın proqramının nəticəsi olan m (2≤m≤1015) tam ədədini ehtiva edir.

Çıxış məlumatları. Hər test üçün iki sətir çap edin. Birinci sətir m ədədini binomial əms

aldan ifadə etməyin üsullarının sayını ehtiva etməlidir. İkinci sətirdə Cnk​=m şərtini ödəyən bütün (n,k) cütləri olmalıdır. Cütlər n artan sırası ilə və k artan sırası ilə yerləşdirilməlidir. Cütlərin çap formatı nümunədə göstərilmişdir.

Giriş məlumatları
2
2
15
Çıxış məlumatları
1
(2,1) 
4
(6,2) (6,4) (15,1) (15,14)
Məsələni aç
Həll

Cnk​=m şərti yerinə yetirilərsə, onda Cnn−k​=m şərti də yerinə yetirilir. k≤n/2 həllini tapmaq və (k,n) cütü ilə birlikdə (k,n–k) cütünü də çıxarmaq kifayətdir. k=n/2 olduqda bu iki cüt eyni olur.

p-ni C2pp​>m olan ən kiçik ədəd qəbul edək. Onda 0≤k<p olduğu aydındır.

k-ni sabitləşdirmək üçün C2kk​≤m və f(n)=Cnk​ funksiyasını nəzərdən keçirək. Onda 2k≤n≤m aralığında f(n) funksiyası artandır. Deməli, f(n)=m tənliyini ikili axtarışla həll etmək olar.

Beləliklə, k (0≤k<p) qiymətlərini nəzərdən keçirmək və hər belə k üçün Cnk​=m tənliyini ikili axtarışla həll etmək lazımdır. Tapılan n dəyəri tam ədəd olmalıdır.

Nümunə

Cnk​=3003 tənliyini nəzərdən keçirək. C126​=924, C147​=3432 olduğuna görə, 0≤k≤6 nəzərdən keçirmək kifayətdir.

k=2 olduqda Cn2​=3003 tənliyini və ya 2n⋅(n−1)​=3003, n⋅(n–1)=6006 tənliyini nəzərdən keçirək. 4≤n≤3003 aralığında ikili axtarışla tam həll n=78 tapılır. n=2⋅k olduğuna görə iki həll var: C782​=C7876​=3003.

Alqoritmin tətbiqi

Axtarılan cütləri cütlər vektorunda saxlayaq.

vector<pair<long long,long long> > res;

Cnk funksiyası Cnk​ binomial əmsalının qiymətini hesablayır.

long long Cnk(long long n, long long k)
{
  long long i, Res = 1;
  if (k > n - k) k = n - k;
  for(i = 1; i <= k; i++)
  {

Növbəti iterasiyada nəticə m-i keçərsə (məsələni həll etmək üçün Cnk​=m tənliyini axtarırıq), dayanırıq. Bu funksiyadan çıxmaqla yüklənmədən də qaçırıq.

    if (1.0 * Res * (n - i + 1) / i > m) return m + 1;
    Res = Res * (n - i + 1) / i;
  }
  return Res;
}

Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.

scanf("%d",&tests);
while (tests--) 
{
  res.clear();
  scanf("%lld",&m);

k dəyərini C2kk​≤m qədər nəzərdən keçirin.

  for(k = 0; Cnk(2*k,k) <= m; k++)
  {

2k≤n≤m aralığında n dəyərini ikili axtarışla tapın.

    long long lo = 2*k, hi = m;
    while (lo < hi) 
    {
      long long n = (lo + hi) / 2;
      if (Cnk(n,k) < m) lo = n + 1; else hi = n;
    }

Clok​=m olduqda həll tapılır. Nəticəyə bir və ya iki cüt həll daxil edin.

    if (Cnk(lo,k) == m)
    {
      res.push_back(make_pair(lo,k));
      if (lo != 2*k)
        res.push_back(make_pair(lo,lo - k));
    }
  }
C++
7 lines
144 bytes

Cütləri sırala.

  sort(res.begin(),res.end());

Cavabı çıxarın - tapılan cütlərin sayını və cütləri.

  printf("%d\n",res.size());
  for(i = 0; i < res.size(); i++)
    printf("(%lld,%lld) ", res[i].first,res[i].second);
  printf("\n");
}

Binomial əmsal üçün asimptotik qiymətləndirmələr

Teorema 1. Binomial əmsallar arasında belə bir əlaqə var:

Cn0​<Cn1​<...<Cn⌊n/2⌋​≥Cn⌊n/2⌋+1​>...>Cnn​

Teorema 2. C2nn​<4n. Bu ondan irəli gəlir ki, ∑k=02n​C2nk​=(1+1)2n=22n=4n

Teorema 3. C2nn​>2n+14n​. Bu ondan irəli gəlir ki, ∑k=02n​C2nk​=4n, və əmsallar 2n+1-dir. Buna görə daha böyük əmsal 2n+14n​-dən çox olacaq.

Teorema 4. Stirlinq formulu. n!≈2πn​(en​)n.

Daha dəqiq təxmini formulu:

n!≈2πn​(en​)n(1+12n1​+288n21​−51849n3139​−2488320n4571​)

Teorema 5.

C2nn​≈(2πn​(en​)n)24πn​(e2n​)2n​=πn​4n​

Teorema 6.

Cnk​=k!(n−k)!n!​=1⋅2⋅3⋅...⋅kn⋅(n−1)⋅(n−2)⋅...⋅(n−k+1)​=
k!n!​⋅(1−n1​)⋅(1−n2​)⋅...⋅(1−nk−1​)=
k!n!​⋅eln(1−n1​)+ln(1−n2​)+...+ln(1−nk−1​)≤(ln(1−x)≤−x neqali vasitəsilə)
k!n!​⋅e−n1​−n2​−...−nk−1​=k!n!​⋅e−2nk⋅(k−1)​

İstifadə olunan məsələlərin siyahısı

  • 318. Binomial əmsallar

  • 3260. Neçə?

  • 4008. Binomial əmsallar

  • 5329. Axşam

  • 9892. C0n + … + Cnn

  • 10668. Şəbəkə üzərində yollar

  • 11271. Cnk kvadratlarının cəmi

  • 11550. x1 + … + xk = n

  • 11551. x1 + … + xk = n (2)

  • 11488. Binomial cəm


36

Şərhlər

Yüklənir

Bir an, serverdən məlumat alınır

Hələ də heç nə

Söhbəti başladan ilk siz olun!
Daxil ol