x1+...+xk = n#11550

x1+...+xk = n (Həll təhlili)

"Toplar və arakəsmələr" ("stars and bars") üsulundan istifadə edək. ədəd vahidi ardıcıl yazaq: . Qonşu vahidlər arasında n - 1 aralıq var. Onlardan istənilən k - 1 ədədini seçib hər seçilmiş aralığa '' işarəsi qoyaq. Vahidlər ədəd ardıcıl qrupa bölünəcək; -ci qrupdakı vahidlərin sayını x_i ilə işarə edək. Məsələn, n = 6 olduqda 11+111+1 yazısı x_1 + x_2 + x_3 = 6 tənliyinin (2, 3, 1) həllini müəyyən edir.

Hər belə düzülüş tənliyin natural həllini müəyyən edir. Həqiqətən, bütün qrupların ölçülərinin cəmi -ə bərabərdir, hər qrup isə boş deyil: birinci vahiddən əvvəl və sonuncu vahiddən sonra '' işarəsi qoyulmur, və bir aralığa iki işarə qoymaq olmaz. Deməli, bütün x_i \ge 1.

Tənliyin həlləri ilə n - 1 aralıqdan k - 1 ədədini seçmə üsulları arasında qarşılıqlı birqiymətli uyğunluq mövcuddur. Buna görə axtarılan həllərin sayı C_{n-1}^{k-1}-ə bərabərdir.

Məsələn, n = 5, k = 3 olduqda n - 1 = 4 aralıq var, onlardan k - 1 = 2-sini seçmək lazımdır. Bunu C_4^2 = 6 üsulla etmək olar, və hər seçimə x_1 + x_2 + x_3 = 5 tənliyinin düz bir həlli uyğun gəlir:

Misal

x_1 + x_2 + x_3 = 4 tənliyinə baxaq. Onun müsbət tam ədədli həlli var: (1, 1, 2), (1, 2, 1), (2, 1, 1).

Məsələn, n = 4 vahidi k = 3 toplananlara C_2^3 = 3 üsulla bölmək olar:

Qeyd

Bu məsələnin bir neçə variantına baxaq:

Alqoritmin reallaşdırılması

Cnk funksiyası C_n^k binom əmsalının qiymətini hesablayır.

long long Cnk(long long k, long long n)
{
  long long res = 1;
  if (k 
    res = res * (n - i + 1) / i;
  return res;
}

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

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

C_{n-1}^{k-1} cavabını hesablayıb çıxarırıq.

res = Cnk(k - 1, n - 1);
printf("%lld\n", res);

Python reallaşdırılması

import math

Giriş məlumatlarını oxuyuruq.

k, n = map(int,input().split())

C_{n-1}^{k-1} cavabını hesablayıb çıxarırıq.

res = math.comb(n - 1, k - 1)
print(res)