Binomial əmsalı
Seçim elementdən elementin seçilməsidir, burada verilmiş elementdən 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, elementdən ibarət olan çoxluğu nəzərdən keçirək: . və dəstləri seçim olaraq eyni hesab olunur (yerdəyişmə olaraq fərqli olsalar da), çünki eyni elementlərdən ibarətdir.
-dən -yə qədər seçimlərin sayının hesablanması üçün formula belədir
ədədləri binomial əmsallar adlanır.
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, topları olan bir qutunuz var və onlardan ə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ə, -dən element seçmənin sayını bildirir ki, bu da -ə 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ə verir.
elementdən ibarət olan çoxluqdan bir element seçdiyimiz zaman seçmə variantımız var: elementdən istənilən birini seçə bilərik. Məsələn, -dən -ə qədər ədədlərdən ibarət olan çoxluqdan () bir ədəd seçsək, bu çoxluqdan bir ədəd seçmək üçün variantımız var.
-in dəyəri -ə bərabərdir, çünki elementdən ibarət olan çoxluqdan bir elementi seçmənin yolu var.
elementdən ibarət olan çoxluqdan 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 elementdən seçə bilərik.
Birinci elementi seçdikdən sonra ikinci elementi seçmək üçün element qalır (çünki eyni elementi təkrarən seçə bilmərik).
Beləliklə, 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: .
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, və eyni cütlük hesab olunur. Bunu nəzərə alaraq, cütlüklərin ümumi sayını -yə bölmək lazımdır. Beləliklə, -yə bərabərdir.
Simmetriya xüsusiyyəti: .
elementdən elementi seçmənin sayı elementdən elementi seçmənin sayına bərabərdir. Amma elementdən elementi seçmənin yolu var. Deməli, .
Tapşırıq. Aşağıdakı binomial əmsalların qiymətlərini hesablayın:
1) | 3) | 5) |
2) | 4) | 6) |
Yığma formulu: .
İspat. Bərabərliyin sağ tərəfindəki dəyəri hesablayın:
Binomial əmsalın hesablanması üçün aşağıdakı nisbətdən istifadə edə bilərsiniz:
qiyməti ilə dəyişən təyin edin. Sonra -i -ə vurun və nəticəni -ə bölün. Sonra -i -ə vurun və -yə bölün. Çoxaltma və bölmə prosesini dəfə davam etdirin (-nin payı və məxrəci ilə qısaldıqdan sonra vurucu ehtiva edir).
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; }
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);
Binomial əmsalın rekursiv tətbiqi üçün aşağıdakı nisbətdən istifadə edə bilərsiniz:
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);
LKS-lər arasında neçə nəfər kefir alacağını seçmək üçün neçə yol var? Cavabı -a bərabər olaraq çıxarın.
Giriş məlumatları. və tam ədədləri.
Çıxış məlumatları. Cavabı -a bərabər olaraq çıxarın.
6 3
20
Məsələnin cavabı -a bərabər olacaq. Bərabərliyin hesablanması zamanı bölmədən qaçmaq üçün nisbətindən istifadə edəcəyik.
olduğuna görə, memorizasiya texnikasından istifadə edəcəyik.
Sabitləri və massivini elan edək, burada .
#define MAX 510 #define MOD 9929 int cnk[MAX][MAX];
c funksiyası 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; }
Proqramın əsas hissəsi. 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:
Nümunələri nəzərdən keçirək:
Verilmiş qeyri-mənfi tam ədəd üçün binomial əmsalların cəmini tapın
Giriş məlumatları. Bir qeyri-mənfi tam ədəd .
Çıxış məlumatları. Cəmin qiymətini çıxarın.
2
4
Nyuton binomu formulu belədir:
qiymətini verərsək, bu əlaqə belə görünür:
və ya
Beləliklə, göstərilən cəm -ə bərabərdir.
Nümunə
üçün:
üçün:
üçün:
Giriş dəyəri -i oxuyun.
scanf("%lld", &n);
Cavabı hesablayın və çıxarın — qiyməti.
res = 1LL << n; printf("%lld\n", res);
Verilmiş qeyri-mənfi tam ədəd üçün binomial əmsalların kvadratlarının cəmini tapın
Giriş məlumatları. Bir qeyri-mənfi tam ədəd .
Çıxış məlumatları. Cəmin qiymətini çıxarın.
3
20
obyektlərindən -i nəzərdən keçirək və obyektlərindən obyektini seçmənin sayını tapın.
Çoxluğu iki hissəyə bölək: . obyektlərindən obyektini seçmək üçün, sol yarıdan (yəni çoxluğundan) obyektini və sağ yarıdan obyektini seçmək lazımdır (yəni çoxluğundan). Bu seçimi etmənin yollarının sayı vurma qaydasına görə -ə bərabərdir. -dan -ə qədər dəyişə bildiyi üçün -dən -ə qədər seçmənin yollarının sayına bərabərdir, yəni . Beləliklə
Nümunə
üçün cavab belədir:
Eyni zamanda .
Cnk funksiyası 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; }
Proqramın əsas hissəsi. Giriş dəyəri -i oxuyun.
scanf("%lld", &n);
Cavabı hesablayın və çıxarın.
res = Cnk(2*n, n); printf("%lld\n", res);
Verilmiş və dəyərlərinə görə aşağıdakı tənliyin natural həllərinin sayını tapın
Giriş məlumatları. İki natural ədəd və .
Çıxış məlumatları. Verilmiş tənlik üçün natural həllərin sayını çıxarın. Məlumdur ki, cavab -i keçmir.
3 4
3
vahidlərindən ibarət olan ardıcıllığı nəzərdən keçirək: . İki vahid arasında '+' işarəsini qoymaq olar. Məsələn, . Bu yazı 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ı -ə bərabərdir. Çünki sətirlərini əldə etmək üçün '+' işarəsini qoymaq lazımdır.
mövqeyində plüs işarəsini qoymaq yolla mümkündür.
Nümunə
tənliyinin üç təbii tam həlli var:
Məsələn, vahidləri sətirlərə yolla bölmək olar:
Cnk funksiyası 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; }
Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.
scanf("%lld %lld", &k, &n);
cavabını hesablayın və çıxarın.
res = Cnk(k - 1, n - 1); printf("%lld\n", res);
Verilmiş və dəyərlərinə görə aşağıdakı tənliyin qeyri-mənfi tam ədəd həllərinin sayını tapın
Giriş məlumatları. İki natural ədəd və .
Çıxış məlumatları. Verilmiş tənlik üçün qeyri-mənfi tam ədəd həllərinin sayını çıxarın. Məlumdur ki, cavab -i keçmir.
3 4
15
mövqelərindən ibarət ardıcıllığı nəzərdən keçirək. mövqeyində qoyulmalıdır. mövqeyində '+' işarəsi qoyulmalıdır (yəni 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, tənliyinin bəzi həlləri aşağıdakılardır ( vahid və plüs):
plüs işarəsini mövqeyinə qoymaq yolla mümkündür.
Nümunə
tənliyinin həlləri aşağıdakılardır:
və onun dəyişməsi
və onun dəyişməsi
və onun dəyişməsi
və onun dəyişməsi
Ümumilikdə həll var.
Cnk funksiyası 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; }
Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.
scanf("%lld %lld", &k, &n);
cavabını hesablayın və çıxarın.
res = Cnk(k - 1, n + k - 1); printf("%lld\n", res);
qeyri-mənfi tam ədəd olsun. Göstərək ki,
Verilmiş və üçün -nin qiymətini hesablayın.
Giriş məlumatları. Birinci sətir testlərin sayını ehtiva edir. Növbəti sətirin hər biri iki tam ədəd və ehtiva edir.
Çıxış məlumatları. Hər bir test üçün dəyərini ehtiva edən sətir çıxışa verin.
6 0 0 1 0 1 1 2 0 2 1 2 2
1 1 1 1 2 1
Hesablamalar bitlik işarəsiz tam ədədlərdən (unsigned long long) istifadə edilərək aparılacaq. Aydındır ki,
Dəyişən -ə qiyməti verin, sonra isə onu -dən -yə qədər bütün -ə vurun. Hər dəfə bölmə tam ədədli olacaq, lakin vurma zamanı yüklənmə baş verə bilər. olsun. Onda əməliyyat
aşağıdakı kimi yazılsın
Bu tətbiqlə vurma zamanı yüklənmə baş verməyəcək (cavab bitlik işarəsiz tam ədəddir). Əvvəlcə bölməsini, sonra isə -i əldə edilmiş qismətə vurmağı unutmayın.
-nı hesablamaq üçün iterasiya yerinə yetirmək lazımdır. Lakin -u hesablamaq lazım gələrsə nə etməli? Cavab -ü keçməyəcək, ona görə də belə giriş məlumatları mümkündür. olduğuna görə olduqda qəbul edilməlidir.
Nümunə
Aşağıdakı nümunəni nəzərdən keçirək:
vurması qalıb. . Buna görə .
gcd funksiyası və ə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ə -i keçərsə (məsələni həll etmək üçün 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); }
Verilmiş natural ədəd . Aşağıdakı cəmin qiymətini tapın
Giriş məlumatları. Bir natural ədəd .
Çıxış məlumatları. Axtarılan cəmin qiymətini çıxarın.
3
20
Verilmiş cəmi aşağıdakı kimi yazın:
Qövslərdə olan cəm -ə bərabərdir. Nyuton binomu formulasında
qəbul edildikdə, əlaqə belə görünəcək: , və ya
Qalan cəmi hesablayın:
Beləliklə, cavab -ə bərabərdir.
Nümunə
üçün cavabı hesablayaq. Düzgün hesablama ilə:
Formula ilə hesablama zamanı: .
Giriş dəyəri -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: .
int dp[31][31];
Cnk funksiyası 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; }
Proqramın əsas hissəsi. Giriş dəyəri -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);
Sizdə bir parça kağız var və onda ö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 və .
Çı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 bitlik işarəli tam ədədə uyğun gəldiyini deyə bilərik.
3 4
35
1 1
2
Axtarılan yol seqmentindən ibarət bir ziqzaqdır. Onlardan seqmentləri şaquli, qalanları isə üfüqi olmalıdır. şaquli seqmentləri -dən seçməyin yollarının sayı -ə bərabərdir.
Nümunə
Birinci nümunə üçün . Cavab -ə bərabərdir.
İkinci nümunə üçün . Cavab -ə bərabərdir.
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; }
Proqramın əsas hissəsi. Giriş məlumatlarını oxuyun.
scanf("%lld %lld", &n, &m);
cavabını hesablayın və çıxarın.
res = Cnk(n + m, n); printf("%lld\n", res);
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 bu ədəddir
və qeyri-mənfi ədədlərdir.
Gunnar proqramından istifadə edərək -ni hesablayıb və nəticədə ədədini alıb. Təəssüf ki, unutqan olduğuna görə, o, giriş kimi istifadə etdiyi və ə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 və ə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 , ehtiva edir. Hər test bir sətirdə verilir və Gunnarın proqramının nəticəsi olan tam ədədini ehtiva edir.
Çıxış məlumatları. Hər test üçün iki sətir çap edin. Birinci sətir ədədini binomial əms
aldan ifadə etməyin üsullarının sayını ehtiva etməlidir. İkinci sətirdə şərtini ödəyən bütün cütləri olmalıdır. Cütlər artan sırası ilə və artan sırası ilə yerləşdirilməlidir. Cütlərin çap formatı nümunədə göstərilmişdir.
2 2 15
1 (2,1) 4 (6,2) (6,4) (15,1) (15,14)
şərti yerinə yetirilərsə, onda şərti də yerinə yetirilir. həllini tapmaq və cütü ilə birlikdə cütünü də çıxarmaq kifayətdir. olduqda bu iki cüt eyni olur.
-ni olan ən kiçik ədəd qəbul edək. Onda olduğu aydındır.
-ni sabitləşdirmək üçün və funksiyasını nəzərdən keçirək. Onda aralığında funksiyası artandır. Deməli, tənliyini ikili axtarışla həll etmək olar.
Beləliklə, qiymətlərini nəzərdən keçirmək və hər belə üçün tənliyini ikili axtarışla həll etmək lazımdır. Tapılan dəyəri tam ədəd olmalıdır.
Nümunə
tənliyini nəzərdən keçirək. , olduğuna görə, nəzərdən keçirmək kifayətdir.
olduqda tənliyini və ya , tənliyini nəzərdən keçirək. aralığında ikili axtarışla tam həll tapılır. olduğuna görə iki həll var: .
Axtarılan cütləri cütlər vektorunda saxlayaq.
vector<pair<long long,long long> > res;
Cnk funksiyası 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ə -i keçərsə (məsələni həll etmək üçün 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);
dəyərini qədər nəzərdən keçirin.
for(k = 0; Cnk(2*k,k) <= m; k++) {
aralığında 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; }
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ü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:
Teorema 2. . Bu ondan irəli gəlir ki,
Teorema 3. . Bu ondan irəli gəlir ki, , və əmsallar -dir. Buna görə daha böyük əmsal -dən çox olacaq.
Teorema 4. Stirlinq formulu. .
Daha dəqiq təxmini formulu:
Teorema 5.
Teorema 6.