www.agora.ro
Încape? Nu încape?

Principiul cutiei lui Dirichlet

Mihai Oltean

În Gazeta de Informatică nr. 9-10 din 1994 domnul prof. dr. Horia Georgescu a prezentat un articol în care a încercat să atragă atenția rezolvitorilor de probleme asupra principiului enunțat de renumitul matematician Peter Gustav Lejeune Dirichlet (1805-1859). Înainte de a continua analiza unor probleme a căror rezolvare se bazează pe acest principiu, îl reamintim:

"Se consideră M obiecte care trebuie plasate în N cutii și un număr natural K având proprietatea M>K*N. Atunci pentru oricare amplasament există o cutie care va conține cel puțin K+1 obiecte."

1. Grade egale

Să se determine două submulțimi disjuncte ale mulțimii nodurilor unui graf neorientat cu proprietatea că suma gradelor nodurilor dintr-o submulțime este egală cu suma gradelor nodurilor din cealaltă submulțime.

Soluție

Vom arăta că există două astfel de submulțimi care au fiecare cardinalul 1, adică sunt formate dintr-un singur element. Cu alte cuvinte trebuie demonstrat că într-un graf neorientat există două noduri care au același grad. Valorile gradelor nodurilor sunt elemente din mulțimea {0,...,n-1}, care este o mulțime de cardinal n. Însă, dacă există un nod de grad n-1 înseamnă că el este conectat cu toate celelalte noduri, deci nu vor exista noduri izolate (de grad 0). Asta înseamnă că mulțimea gradelor nodurilor unui graf neorientat are cel mult n-1 valori distincte, care vor trebui distribuite la cele n noduri ale grafului, deci conform pricipiului cutiei, cel puțin două noduri vor avea același grad.

Referitor la implementarea practică a acestei probleme, ne interesează să găsim un algoritm de complexitate liniară care să determine cele două noduri în cauză. Un astfel de algoritm este asemănător cu algoritmul de sortare liniară, și anume: definim un vector:

b:array[0..MaxN] of Word;

în care pe poziția k reținem numărul nodurilor având gradul k. Acest vector se poate construi printr-o singură parcurgere a șirului gradelor nodurilor. Apoi se determină care grad k are atașat cel puțin două noduri (b[k] este cel puțin 2). Algoritmul este următorul:

Listing GRADE.PAS

program DouaGradeEgale;

const MaxN = 100;

var grad:array[1..MaxN] of 0..MaxN-1;

b:array[0..MaxN-1] of 0..MaxN;

nod:array[0..MaxN-1] of 1..MaxN;

n,i,j:Word;

procedure Citire;

var f:Text; c:Char;

begin

Assign(f,'GRAFD.IN'); Reset(f);

Readln(f,n);

for i:=1 to n do

begin

for j:=1 to n do

begin

Read(f,c);

Inc(grad[i],Ord(c)-48);

Inc(grad[j],Ord(c)-48)

end;

Readln(f)

end;

Close(f)

end;

Begin

Citire;

for i:=1 to n do

begin

Inc(b[grad[i]]);

if b[grad[i]]=2

then

begin

Write('Nodurile cautate sunt: ');

Writeln(nod[grad[i]],' si ',i);

Exit

end

else nod[grad[i]]:=i

end

End.

Un enunț echivalent este: "Într-o cameră se află n persoane, fiecare cunoscând un anumit număr de alte persoane (din aceea cameră). Să se arate că există două persoane care au același număr de cunoștințe".

Pentru un graf neorientat soluția de mai sus nu mai este valabilă. Pentru a rămâne totuși valabilă această rezolvare, putem impune condiția ca din fiecare nod să plece cel puțin un arc. În acest caz vom avea cel puțin două noduri cu același grad exterior.

2. Concurs

La un concurs de informatică au participat M elevi care au avut de rezolvat N probleme. Se cunoaște numărul xk al elevilor care au reușit să rezolve problema k. Să se determine cel mai mare număr S astfel încât să existe sigur cel puțin un concurent care a rezolvat minim S probleme și să se determine și numărul celor care au rezolvat cel puțin S probleme.

Soluție

În total s-au rezolvat S=x1+x2+...+xN probleme. Dacă toți elevii au rezolvat cel puțin o problemă, atunci mai rămân S-M probleme. Raționamentul se continuă pentru două probleme, trei probleme etc., atât timp cât se mai poate scădea din S. Să presupunem că am ajuns la un k (deci elevii au rezolvat câte k probleme fiecare) pentru care S-kM este mai mic sau egal decât M. Numărul k+1 este sigur cel mai mare număr de probleme pe care le-a rezolvat un elev, iar S-kM este numărul de elevi despre care putem afirma cu siguranță că au rezolvat k+1 probleme. Toți acești pași se reduc la următorii doi:

1) Numărul maxim sigur de probleme rezolvate de către un elev este:

S div M;

2) Numărul de elevi care îndeplinesc acest maxim este:

S mod M.

3. Divizor

Se dă un număr impar a. Se cere să se determine un număr natural b, astfel încât 2b-1 se divide la a.

Soluție

Considerăm numerele 20-1,21-1,...,2a-1. Acestea sunt a+1 numere. Conform principiului cutiei cel puțin două dintre ele dau același rest prin împărțirea la a. Fie:

2k-1 și 2m-1 (k<m)

aceste numere. Atunci numărul 2m-1-(2k-1)=2k(2m-k-1) se divide prin a și deoarece a este impar, rezultă că 2m-k-1 se divide la a.

Deoarece avem certitudinea că există întotdeauna un astfel de multiplu, algoritmul de rezolvare este simplu și constă în a calcula resturile împărțirii lui 2k-1 la a (pentru k=0...a).

Listing MULTIPLU.PAS

program multiplu;

const MaxN=30000;

var a:array[0..MaxN] of Word;

n,i:word;

Begin

repeat

Write('n:'); Readln(n)

until Odd(n);

a[0]:=1; i:=0;

repeat

Inc(i);

a[i]:=2*a[i-1] mod n

until a[i]-1=0;

Writeln(i)

End.

Un enunț echivalent este următorul: "Se dă un număr impar a. Se cere să se determine un multiplu al său care, scris în baza 2 (doi), are doar cifre de 1". Echivalența acestor două enunțuri este adevărată, deoarece un număr de forma 2b-1 se scrie în baza doi ca o succesiune de b-1 de 1. Evident, se exclude cazul în care a=1.

Se poate demonstra și afirmația mai puternică: dacă numerele naturale a și c sunt prime între ele, atunci există un număr natural b astfel încât cb-1 se divide cu a.

Enunțul echivalent este următorul: "Se dau două numere naturale a și c prime între ele. Să se determine un multiplu a lui a, care scris în baza c are doar cifre de 1".

4. Eliminare cifre

Se consideră un număr natural care are N cifre toate nenule. Se cere să se determine un alt număr natural format doar din cifrele numărului inițial (nu este obligatorie utilizarea tuturor cifrelor și în plus se poate folosi și cifra 0) și care se divide la N.

Soluție

Fie numărul dat. Considerăm numerele:

Acestea au resturile împărțirii la N în domeniul 0...N-1. Dacă există un rest 0, atunci numărul respectiv este cel căutat. Dacă nu, avem de a face cu N resturi din domeniul 1..N-1, adică N-1 resturi și conform principiului cutiei vor exista două resturi egale, deci două numere B și C care au același rest la împărțirea cu N. Scădem aceste numere și rezultatul este ceea ce ne interesează.

5. Suma a două elemente

Se consideră N numere naturale distincte, strict pozitive, strict mai mici decât 2N și toate diferite de N. Să se determine două dintre ele care au suma egală cu 2N.

Soluție

Dacă 0<a<2n, atunci și 0<2n-a<2n. Fie a1,a2,...,aN cele N numere. Atunci și 2N-a1, 2N-a2,...,2N-aN îndeplinesc condițiile din enunț. Considerăm numerele a1,a2,...,aN, 2N-a1,2N-a2,...,2N-aN. Ele sunt în număr de 2N. Dar în intervalul (0,2N) există doar 2N-1 numere distincte, deci conform principiului cutiei, cel puțin două dintre ele sunt egale, și anume unul din mulțimea {a1,a2,...,aN} iar celălalt din mulțimea {2N-a1,2N-a2,...,2N-aN}. Fie ele ai respectiv 2N-aj. Deci avem ai=2N-aj, adică ai+aj=2N. Cazul i=j este exclus prin enunț.

Acum, pentru că avem certitudinea existenței soluției putem aplica același algoritm ca și la problema 1.

6. Submulțimi

Fie M={1,2,...,N} mulțimea primelor N numere naturale. Să se determine condiția pentru existența a două submulțimi A și B ale lui M, distincte, de cardinal mai mic sau egal cu K astfel încât suma numerelor dintr-o submulțime să fie egală cu suma numerelor din cealaltă submulțime.

Soluție

Numărul submulțimilor de cardinal cel mult K este 2K. Din acest număr scădem 1 (reprezentat de mulțimea vidă).

Suma numerelor unei submulțimi AÌM de cardinal cel mult K este cuprinsă între 1 (mulțimea formată doar din elementul 1) și S=N+(N-1)+...(N-K+1), adică în total S valori distincte pentru suma elementelor submulțimilor. Pentru ca să existe cel puțin două submulțimi egale, trebuie să se îndeplinească condiția 2K-1>S, inegalitate care reprezintă condiția care ne interesează.

7. Sumă submulțime

Se consideră N numere naturale nenule a căror sumă este strict mai mică decât 2N. Să se determine o submulțime de sumă N.

Soluție

Condiția ca suma numerelor să fie strict mai mică decât 2N este necesară, deoarece în caz de egalitate s-ar putea să nu avem soluție. Spre exemplu, dacă N=2 și numerele sunt 1 și 3, nu găsim nici o submulțime de sumă 2.

Fie a1,a2,...,aN cele N numere. Calculăm sumele parțiale a1,a1+a2,a1+a2+a3,...,a1+a2+...+aN. Resturile împărțirii acestor numere la N sunt în domeniul {0,...,N-1}. Dacă unul din resturi este 0, atunci suma care a generat acel rest este ceea ce căutăm. În caz contrar, conform principiului cutiei, avem două resturi egale (care se termină prin ai și aj, i<j) și atunci submulțimea căutată este ai+1,...,aj. Faptul că suma tuturor elementelor este strict mai mică decât 2N ne asigură că submulțimea obținută are suma exact N și nu un multiplu de N.

8. Produs submulțime

Se consideră N numere naturale. Se cere să se determine o submulțime a lor astfel încât produsul elementelor din submulțime să fie multiplu de N.

Soluție

Aplicăm aceleași raționamente ca și în cazul în care avem de a face cu sumă în loc de produs.

Listing SIR.PAS

program sir;

const MaxN = 1000;

var a:array[1..MaxN] of Longint;

rest:array[0..MaxN] of Longint;

n,i,j:Word;

f:Text;

Begin

Assign(f,'SIR.IN');

Reset(f);

rest[0]:= 0;

for i:= 1 to n do

begin

Read(f,a[i]);

rest[i]:=rest[i-1]*a[i] mod n;

if rest[i]=0

then

begin

Write('Secventa de la 1 la ',i);

Writeln('este o solutie a problemei');

Close(f);

Exit

end

end;

Close(f);

for i:=1 to n-1 do

for j:=i+1 to n do

if rest[i]=rest[j]

then

begin

Write('Secventa de la ',i+1,' la ');

Writeln(j,'e o solutie a problemei');

Exit

end

End.

Observații:

Cazurile în care se cere ca submulțimea să aibă un număr minim de elemente, sau multiplul obținut să fie minim se rezolvă prin alte metode.

9. Produse divizibile

Se consideră o mulțime A de N+1 numere naturale nenule, mai mici sau egale cu 2N. Să se determine două submulțimi X și Y, incluse în A, astfel încât produsul elementelor dintr-o submulțime să fie divizibil cu produsul elementelor din cealaltă submulțime.

Soluție

Vom arăta că în mulțimea A care îndeplinește condițiile din enunț există două elemente care se divid unul pe celălalt.

Fie a1,a2,...,aN+1 cele N+1 numere naturale. După o prealabilă ordonare și renumerotare avem:

1Ła2Ła2Ł...ŁaN+1Ł2N.

Orice număr natural se poate scrie sub forma 2xŚy, unde x este un număr natural, iar y este un număr natural impar. Deci a1=2x1Śy1, a2=2x2Śy2,..., aN+1=2xN+1ŚyN+1.

Dar între 1 și 2N există exact N numere impare și deci, conform principiului cutiei, două dintre numerele y1y2,...,yN+1 sunt egale. Fie acestea yi și yj cu i<j. Atunci numărul ai=2xiŚyi divide pe aj=2xjŚyj.

10. Progresie

Fie mulțimea M de cardinal N și a cărei termeni sunt în progresie aritmetică de rație A și cu primul termen X. Să se arate că oricare ar fi H o submulțime a lui M, de cardinal

(N - 2) div 2 + 3

există în ea două elemente a căror sumă este AN + 2X.

Soluție

Elementele mulțimii M sunt de forma:

X, X+A, X+2A, ..., X+(N-1)A.

Dacă N este par, atunci facem următoarea partiționare în (N - 2) div 2 + 2 clase:

{X}, {(AN+2X) div 2}, {X+A,X+(N-1)A},

{X+2A,X+(N-2)A}, ...

Dacă N este impar, atunci facem următoarea partiționare în (N-2) div 2+2 clase:

{X}, {X+A,X+(N-1)A}, {X+2A,X+(N-2)A}, ...

Deoarece fiecare partiționare are câte

(N - 2) div 2+2

clase, înseamnă că orice submulțime H cu proprietățile din enunț conține cel puțin un element din fiecare clasă. Deci va exista cel puțin o clasă care conține ambele elemente. Dar suma elementelor din clasa respectivă este exact ceea ce ne interesează.

Probleme Propuse:

11. Determinare submulțime

Se dau N numere naturale a1,a2,...,aN strict pozitive a căror sumă este strict mai mică decât 2N-1. Să se determine o submulțime M a acestor numere astfel încât:

12. Numere consecutive

Din oricare 10 numere consecutive putem alege unul prim cu toate celelalte.

13. Permutare

Fie a1,a2,...,aN o permutare a numerelor 1,2,...,N. Să se arate că produsul (a1-1)(a2-2)...(aN-N) este par, dacă N este impar.

14. Sumă divizibilă

Să se arate că din 2N-1 numere naturale strict pozitive, există N a căror sumă este divizibilă cu N.

Soluție

Caz particular: Din oricare trei numere se pot alege două de sumă pară. Dacă printre cele trei numere se găsesc două pare, atunci suma lor va fi un număr par. În caz contrar vor exista două numere impare a căror sumă este un număr par. Aici cutiile au fost reprezentate de multiplii 2k, 2k+1.

O altă modalitate de a demonstra această afirmație se găsește în [3] și [4].

Bibliografie:

1. Horia Georgescu - Principiul cutiei lui Dirichlet, Gazeta de Informatică 9-10/94, Editura Libris, Cluj Napoca, 1994

2. Adrian Ghioca, Nicolae Teodorescu - Culegere de probleme, SSMR, București, 1987

3. Probleme de matematică traduse din revista sovietică Kvant, EDP, București, 1983

4. Oltean Mihai, Numere prime și divizibilitate, Gazeta de Informatică 2/99, Editura Computer PRESS Agora, Târgu Mureș, 1999

5. Colecția Gazetei Matematice

Mihai Oltean este student al Universității "Babeș Bolyai", Cluj. Poate fi contactat prin intermediul redacției.

[cuprins]