Consideriamo un insieme di oggetti distinti a_1, ..., a_{2n} e calcoliamo in quanti modi si possono scegliere da esso oggetti.
Da un lato, per definizione di coefficiente binomiale, questo numero è uguale a C_{2n}^n.
Dall'altro lato, dividiamo l'insieme in due metà di oggetti ciascuna:
Qualsiasi insieme di oggetti è determinato univocamente da quanti oggetti k~(0 \le k \le n) vengono presi dalla metà sinistra: allora dalla metà destra vengono presi esattamente n - k oggetti. Per un fissato, scegliere oggetti dalla metà sinistra si può fare in C_n^k modi, e n - k oggetti dalla metà destra — in C_n^{n-k} modi. Per la regola del prodotto, il numero di insiemi con un dato è uguale a
poiché per la proprietà di simmetria C_n^{n-k} = C_n^k.
Per valori diversi di si ottengono insiemi disgiunti di combinazioni, e percorre tutti i valori da a . Per la regola della somma, il numero totale di modi è uguale a
Uguagliando i due risultati del conteggio, otteniamo l'identità (caso particolare dell'identità di Vandermonde):
Esempio
Per n = 3 la risposta è uguale a (C_3^0)^2 + (C_3^1)^2 + (C_3^2)^2 + (C_3^3)^2 = 1^2 + 3^2 + 3^2 + 1^2 = 20
Allo stesso tempo C_6^3 = {6! \over 3! \cdot 3!} = {4 \cdot 5 \cdot 6 \over 6} = 20.
Implementazione dell'algoritmo
La funzione Cnk calcola il valore del coefficiente binomiale C_n^k.
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;
}Parte principale del programma. Leggiamo il valore di input .
scanf("%lld", &n);Calcoliamo e stampiamo la risposta.
res = Cnk(2*n, n);
printf("%lld\n", res);Implementazione in Java
import java.util.*;
public class Main
{
public static long Cnk(long n, long k)
{
long res = 1;
if (k > n - k) k = n - k;
for (long i = 1; i <= k; i++)
res = res * (n - i + 1) / i;
return res;
}
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
long n = con.nextLong();
long res = Cnk(2*n, n);
System.out.println(res);
con.close();
}
}Implementazione in Python
La funzione Cnk calcola il valore del coefficiente binomiale C_n^k.
def Cnk(n, k):
res = 1
if k > n - k: k = n – k
for i in range(1, k+1):
res = res * (n - i + 1) // i
return resParte principale del programma. Leggiamo il valore di input .
n = int(input())Calcoliamo e stampiamo la risposta.
res = Cnk(2 * n, n)
print(res)Implementazione in Python – comb
Leggiamo il valore di input .
n = int(input())Calcoliamo e stampiamo la risposta.
res = math.comb(2 * n, n)
print(res)