Sinifdə oğlanların sayı b = m - n bərabərdir. Oğlanlar hamısı fərqləndirilə bildiyinə görə, onların düzülmə üsullarının sayı bərabərdir:
oğlanın ətrafında qızların qoyula biləcəyi b + 1 mövqe yaranır:
Cəmisi qız var. Buna görə də qızların qoyula biləcəyi b + 1 mövqedən fərqli mövqe seçməliyik:
Əgər n > b + 1, cavab bərabərdir.
Qızlar da fərqləndirilə bilir, yəni onları da yer dəyişdirmək olar.
Beləliklə, bütün şagirdlərin sıraya düzülebilmə üsullarının sayı bərabərdir:
Nümunə
m = 3, n = 2 testini nəzərdən keçirək.
Oğlanların sayı b = m - n = 3 - 2 = 1 bərabərdir. Cavab bərabərdir:
m = 4, n = 2 testini nəzərdən keçirək.
Oğlanların sayı b = m - n = 4 - 2 = 2 bərabərdir. Cavab bərabərdir:
Alqoritmin Yerləşdirilməsi
Massivlər elan edək:
ədədlərin faktoriyallarını üzrə saxlayır,
factinv bu faktoriyalların əks qiymətlərini üzrə saxlayır:
#define MAX 1000001
#define MOD 1000000007
ll fact[MAX], factinv[MAX];pow funksiyası modul üzrə ədədin dərəcəsini hesablamaq üçündür: x^n~mod~p.
ll pow(ll x, ll n, ll p)
{
if (n == 0) return 1;
if (n % 2 == 0) return pow((x * x) % p, n / 2, p);
return (x * pow(x, n - 1, p)) % p;
}inverse funksiyası üçün sadə modul üzrə tərs ədədi tapır. Çünki sadə ədəddir, fermatın kiçik teoreminə görə:
Bu, (x \cdot x^{p - 2})~mod~p = 1 formasında yenidən yazıla bilər, buradan -ə tərs olan ədəd x^{p - 2}~mod~p olduğu nəticəsi çıxır.
ll inverse(ll x, ll p)
{
return pow(x, p - 2, p);
}Cnk funksiyası binomial koeffisiyenti aşağıdakı formula ilə hesablayır:
ll Cnk(int n, int k)
{
return ((fact[n] * factinv[k]) % MOD * factinv[n - k]) % MOD;
}Proqramın əsas hissəsi. Faktoriyalların massivi və əks faktoriyalların factinv massivi dolur.
fact[0] = 1;
for (i = 1; i < MAX; i++)
fact[i] = (fact[i - 1] * i) % MOD;
factinv[0] = 1;
for (i = 1; i < MAX; i++)
factinv[i] = inverse(fact[i], MOD);Testlərin sayını oxuyuruq.
scanf("%d", &tests);
while (tests--)
{Cari testin məlumatlarını oxuyuruq.
scanf("%d %d", &m, &n);Oğlanların sayını b = m - n hesablayırıq.
b = m - n;Cavabı formula ilə hesablayıb çap edirik:
res = ((fact[n] * fact[b]) % MOD * Cnk(b + 1, n)) % MOD;
printf("%lld\n", res);
}