Sunteți pe pagina 1din 12

Principiul lui Dirichlet

Principiul cutiei lui Dirichlet


Implementri sugerate
Probleme propuse
Soluiile problemelor
Capitolul
8


8.1. Principiul cutiei lui Dirichlet
Cunoscutul matematician Peter Gustav Lejeune Dirichlet a enunat n cartea sa
Recherches sur les formes quadratiques coefficients et indtermines complexes
urmtorul principiu:

Se consider n obiecte care trebuie dispuse n k cutii, cu n > k. Atunci exist o
cutie care va conine cel puin dou obiecte.

Forma generalizat a principiului:

Se consider p obiecte care trebuie plasate n c cutii i un numr natural n care veri-
fic proprietatea: p > n c. Atunci, indiferent de dispunerea obiectelor, va exista o cu-
tie care va conine cel puin n + 1 obiecte.

Plecnd de la acest principiu se pot rezolva uor o serie de probleme.

Exemplul 1
ntr-o mare bibliotec, exist ntotdeauna dou cri care conin acelai numr de
cuvinte (Abraham, 1933).

Soluie
Un rnd al crii poate conine cel mult 20 de cuvinte. O pagin conine cel mult 50
de rnduri. O carte conine cel mult 1000 de pagini. Prin urmare o carte conine cel
mult un milion de cuvinte. Deci o bibliotec n care exist cel puin 1.000.001 cri are
dou cri cu acelai numr de cuvinte.


222 8. Principiul lui Dirichlet

Exemplul 2
ntr-un magazin de nclminte se afl p perechi de pantofi de msuri diferite. Din
pcate pantofii nu sunt mperecheai din neglijena vnztorului care nu i-a pus la loc
n cutiile lor dup ce au fost probai de clieni. Vnztorul dorete s gseasc doi pan-
tofi care formeaz o pereche. Care este numrul minim de pantofi care trebuie cerce-
tai pentru a fi siguri c s-a obinut o pereche?

Soluie
Vnztorul va lua pe rnd cte un pantof i l va pune fie n cutia cu perechea lui,
fie ntr-o cutie nou, dac perechea lui nc nu s-a pus n cutie. n cazul cel mai defa-
vorabil, va lua p pantofi diferii i i va aeza n cutii, iar al p + 1-lea pantof va fi pere-
chea unuia deja ales.

Exemplul 3
Dndu-se cinci puncte n interiorul unui triunghi
echilateral de latur 1, s se arate c exist dou
puncte cu distana dintre ele mai mic de .

Soluie

Ducnd liniile mijlocii n triunghi, vom obine patru triunghiuri echilaterale de la-
tur . Conform principiului, exist un triunghi care conine cel puin dou puncte.
Aceste puncte verific proprietatea cerut.

Exemplul 4
Se dau n + 1 numere naturale diferite, mai mici ca 2n. S se verifice dac exist
printre ele trei numere, astfel nct unul dintre ele s fie egal cu suma celorlalte dou.

Soluie
Fie numerele date a
1
< a
2
< ... < a
n+1
. Atunci se verific relaia:
0 < a
2
a
1
< a
3
a
1
< < a
n+1
a
1
< 2n
Aplicm principiul cutiei pentru numerele a
1
, a
2
, ..., a
n+1
, a
2
a
1
, ..., a
n+1
a
1
,
fiecare avnd valoarea n mulimea {1, 2,, 2n 1}, deci cel puin dou numere sunt
egale. Dar datorit condiiilor problemei, unul dintre aceste dou numere va aparine
mulimii {a
1
, a
2
, ..., a
n+1
} i cellalt mulimii {a
2
a
1
, ..., a
n+1
a
1
}. Fie aceste numere
a
p
i a
q
a
1
. Deci a
p
= a
q
a
1
i atunci a
q
= a
p
+ a
1
.


Exemplul 5
Se consider m calculatoare notate cu c
1
, , c
m
i n imprimante notate cu p
1
, , p
n
,
unde m > n. Se cere s se determine numrul minim de legturi calculator-imprimant,
astfel nct dac la un moment dat n calculatoare doresc simultan s scrie la impri-
mante, acest lucru s fie posibil (legturile stabilite s permit celor n calculatoare s
foloseasc legturi la imprimante diferite).
8. Principiul lui Dirichlet 223

Soluie
Pentru a fi ndeplinit condiia cerut trebuie ca la oricare dintre imprimante s se
scrie, oricum s-ar alege n calculatoare. Fie p
i
o imprimant oarecare. Atunci numrul
minim de legturi necesare spre imprimanta p
i
este m n + 1. Astfel rmn doar m
(m n +1) = n 1 calculatoare nelegate la p
i
i atunci oricum am alege n calculatoare,
unul va scrie la ea.
Cum exist n imprimante, vor fi necesare pentru fiecare imprimant m n + 1 leg-
turi i deci n total n(m n + 1) legturi.

8.2. Implementri sugerate
Pentru a v familiariza cu aceast clas de probleme, v recomandm s scriei progra-
mele aferente exemplelor prezentate.

8.3. Probleme propuse

8.3.1. Camioane
Considerm un depozit care are n ncperi, coninnd diferite cantiti de marf notate
cu c
1
, c
2
, ..., c
n
.
S se scrie un program care determin un grup de ncperi, avnd proprietatea c
suma cantitilor de marf pe care le conin se poate mpri exact la cele n camioane
identice care le transport.

Date de intrare
Prima linie a fiierului de intrare CAMION.IN conine numrul natural n. Urmtoarea
linie conine cele n valori c
i
, (i = 1, 2, , n) separate prin spaii.

Date de ieire
Fiierul de ieire CAMION.OUT va conine numerele de ordine ale camerelor care apar-
in soluiei.

Restricii i precizri
1 n 1000;
1 c
i
30000, i = 1, 2, , n (c
i
sunt numere naturale distincte);
Dac exist mai multe soluii, n fiier se va scrie una singur.

Exemplu
CAMION.IN
7
31 3 6 17 12 1 8
CAMION.OUT
3 4 5
224 8. Principiul lui Dirichlet

8.3.2. Multiplu
Se d un numr natural n. S se gseasc un multiplu al lui care s conin doar cifrele
0 i 1. Fiecare cifr va aprea n multiplu cel puin o dat.

Date de intrare
Prima linie a fiierului de intrare MULTIPLU.IN conine numrul natural n.

Date de ieire
Fiierul de ieire MULTIPLU.OUT va conine multiplul cerut.

Restricii i precizri
1 n 10000.

Exemplu
MULTIPLU.IN
7
MULTIPLU.OUT
1111110

8.3.3. Numere
Se dau (m 1)(n 1) + 1 numere naturale nenule distincte, memorate n irul x. S se
arate c exist cel puin m numere n ir care se divid succesiv unul pe altul sau exist
cel puin n care nu se divid ntre ele. S se afieze numerele care verific aceste condi-
ii. Se cere reprezentarea grafic a rezolvrii problemei.

Date de intrare
Prima linie a fiierului de intrare NUMERE.IN conine numerele naturale m i n,
separate printr-un spaiu. Urmtoarea linie conine cele (m 1)(n 1) + 1 numere x
i
,
separate prin cte un spaiu.

Date de ieire
Numerele se vor introduce treptat n csuele corespunztoare reprezentrii grafice,
conform exemplului. La gsirea soluiei, aceasta se va afia cu o culoare diferit.

Restricii i precizri
1 n, m 100;
0 < x
i
< 30000, i = 1, 2, , (n 1)(m 1) + 1.

Exemplu
NUMERE.IN
5 4
9 22 11 18 15 36 99 220 180 880 440 110 33
8. Principiul lui Dirichlet 225

O imagine posibil pentru datele coninute n fiierul de intrare de mai sus ar fi:

9 11 15
18 22 33
36 99 110
180 220

440

8.3.4. Nunta
La o nunt se ntlnesc mai multe persoane, numerotate de la 1 la n. S se afieze,
dac exist, dou persoane care au acelai numr de rudenii.

Date de intrare
Prima linie a fiierului de intrare NUNTA.IN conine un numr natural n, reprezentnd
numrul nuntailor. Urmtoarele linii conin perechi de numere ntregi i, j cu i i j ru-
denii.

Date de ieire
Fiierul de ieire NUNTA.OUT va conine dou numere naturale, reprezentnd dou
persoane cu acelai numr de rudenii.

Restricii i precizri
1 n 1000;
n fiier se va scrie o singur soluie.

Exemplu
NUNTA.IN
5
1 3
2 3
1 4
2 5
1 5
NUNTA.OUT
2 3

8.3.5. Cifre
S se gseasc un multiplu al numrului natural dat n care conine doar cifrele 0 i 5.

Date de intrare
Prima linie a fiierului de intrare CIFRE.IN conine numrul natural n.

226 8. Principiul lui Dirichlet

Date de ieire
Fiierul de ieire CIFRE.OUT va conine multiplul cerut.

Restricii i precizri
1 n 10000.

Exemplu
CIFRE.IN
7
CIFRE.OUT
50505

8.4. Soluiile problemelor propuse

8.4.1. Camioane
n enun s-a precizat c avem n ncperi i n camioane. n ncperi avem diferite canti-
ti de marf care ar trebui transportate cu cele n camioane. Nu cunoatem capacitatea
de transport a camioanelor, n schimb tim c ele sunt identice. n concluzie, vom cu-
ta s determinm o sum de cantiti care este multiplu de n (i astfel se poate ncrca
fiecare cea de a n-a parte n cte un camion). Astfel problema s-a redus la depistarea
acelor ncperi n care suma cantitilor este multiplu de n.
Vom considera urmtoarele sume:
s
1
= c
1

s
2
= c
1
+ c
2

s
3
= c
1
+ c
2
+ c
3


s
n
= c
1
+ c
2
+ c
3
++ c
n


Distingem dou situaii:
a) Exist i pentru care s
i
este multiplu de n. Atunci grupul de ncperi va conine
ncperile avnd numerele de ordine: 1, 2,, i.
b) Nu exist nici o sum din cele de mai sus care s fie multiplu de n. n acest caz,
vom calcula irul de resturi r
i
= s
i
mod n, i = 1, 2, ..., n. Cum toate cele n resturi sunt
nenule i valorile lor se reduc la cele n 1 elemente ale mulimii {1, 2, , n 1},
aplicnd principul cutiei lui Dirichlet, vor exista dou resturi egale. Fie p i q doi in-
dici (p < q) pentru care r
p
= r
q
. Atunci diferena dintre sumele s
q
i s
p
este multiplu de
n, deci soluia problemei o constituie ncperile p + 1, p + 2, , q. Adic tiind c
s
p
= c
1
+ c
2
+ + c
p
i s
q
= c
1
+ c
2
+ + c
p
+ c
p+1
+ + c
q
, calculm diferena
s
q
s
p
= c
1
+ c
2
+ + c
p
+ c
p+1
+ + c
q
(c
1
+ c
2
+ + c
p
) = c
p+1
+ + c
q
.



8. Principiul lui Dirichlet 227

Subalgoritm Determin_ncperi(n,c):
pentru i=1,n execut:
{ calculm irul de resturi a sumelor pariale a cantitilor din cele n camere }
rest[i] 0
sfrit pentru
r 0 { sumele pariale le generm n r }
pentru i=1,n execut:
r (r + c[i]) mod n { calculm sumele pariale }
dac r = 0 atunci { dac o sum parial se divide cu n }
scrie 1,2,...,i { cantitatea din ncperile 1, 2, ..., i este multiplu de n }
ieire forat din subalgoritm
altfel
dac rest[r] 0 atunci
numr_ncperi i - rest[r]
prima_ncpere rest[r] + 1
pentru j=1,numr_ncperi execut:
scrie prima_ncpere + j - 1
sfrit pentru
ieire forat din subalgoritm
altfel
rest[r] i
sfrit dac
sfrit dac
sfrit pentru
sfrit subalgoritm

8.4.2. Multiplu
Considerm irul numerelor: 1, 11, 111, 1111, 11..1, unde n ultimul numr avem n
cifre de 1.
Vom calcula resturile mpririi acestor numere la n i le vom memora n irul rest
i
,
i = 1, 2, ..., n. Dac n acest ir exist un element rest
k
= 0, atunci numrul cerut se for-
meaz din k cifre de 1 urmate de o cifr 0.
Dac toate elementele irului sunt nenule, ele aparin mulimii {1, 2, , n 1}.
Conform principiului cutiei lui Dirichlet, cel puin dou dintre aceste resturi sunt ega-
le.
Fie p < q i rest
p
= rest
q
. Atunci diferena dintre numrul 111 (avnd q cifre) i
numrul 111 (avnd p cifre) se mparte exact la n i este deci multiplu de n. Num-
rul cerut va avea n acest caz primele q p cifre egale cu 1, iar ultimele p cifre egale
cu 0.



228 8. Principiul lui Dirichlet

Subalgoritm Determin_multiplu(n):
rest[1] 1
pentru i=2,n execut:
rest[i] (rest[i-1] * 10 + 1) mod n
dac rest[i] = 0 atunci
scrie i buci de 1 i un singur 0
ieire forat din subalgoritm
altfel
j 1
repet
dac rest[j] = rest[i] atunci
scrie i-j buci de 1 i j buci de 0
ieire forat din subalgoritm
altfel
j j + 1
pn cnd j = i
sfrit dac
sfrit pentru
sfrit subalgoritm

8.4.3. Numere
Ordonm cresctor irul x, apoi l parcurgem i repartizm numerele ntr-o matrice de
dimensiuni (m 1) (n 1) astfel:
Scriem un numr pe linia i dac x se divide printr-un numr situat pe linia i 1 i i
este maxim avnd aceast proprietate.
Repartizm un numr pe o linie n prima poziie liber.

Vom considera c n matrice exist i linia 0 (care conine elementul 1), dar pe
aceast linie nu putem repartiza numere.

Exemplu
Fie m = 4, n = 4 i numerele: 2, 6, 10, 16, 50, 70, 99, 100, 123, 150. Completm
matricea respectnd paii specificai anterior.

2 2 2 2 2 2 2 2 2 99
6 6 10 16
50 70
100
Am ieit din matrice pe coloana 1. 100 are divizorul 50 pe linia 3, 50 are divizo-
rul 10 pe linia 2, 10 are divizorul 2 pe linia 1. Am gsit deci numerele 2, 10, 50 i 100
care verific prima proprietate.
8. Principiul lui Dirichlet 229

Datorit modului de construire a matricei, n momentul n care se ncearc aduga-
rea unui element x
k
care are un divizor pe linia m 1, acesta ar trebui repartizat pe
coloana 1 a liniei m. Vom putea preciza m numere care se divid reciproc. Unul dintre
acestea este x
k,
de pe linia m. Pe linia precedent (m 1) vom gsi n mod sigur un
divizor al lui. l selectm i continum procedeul avansnd cu nc o linie n matrice
(m 2). Repetm procedeul pn la linia 1 inclusiv.

Exemplu
Fie m = 5, n = 4 i numerele: 2, 6, 10, 12, 16, 18, 38, 56, 80, 90, 101, 300, 245.

2 2 2 2 2 2 2 2
6 6 10



2 11 2
6 10 6 10 16 38
12 12 18


Am ieit din matrice pe linia 2. Din cauz c numerele sunt situate pe aceeai linie,
ele nu se divid unele pe altele. Deci n acest caz soluia problemei este: 6, 10, 16, 38.
ntotdeauna se vor gsi numerele cu proprietatea cerut pentru c n matrice se pot
repartiza doar (n 1)(m 1) numere. Dar trebuie repartizate (n 1)(m 1) + 1. Deci,
n cel mai defavorabil caz, ultimul numr repartizat n matrice va completa o soluie.

n vederea afirii grafice, lungimea i limea reelei de ptrate se calculeaz n
funcie de rezoluia ecranului, stabilindu-se dimensiunea laturii unui ptrat din aceast
reea. Cunoscnd aceast valoare i stabilind coordonatele colului stnga-sus al ree-
lei, se deseneaz efectiv reeaua de (n 1)(m 1) ptrate n procedura desen_retea,
pentru fiecare ptrat calculndu-se coordonatele colurilor stnga-sus i dreapta-jos.


coloana j
linia i
latura
x
ij
, y
ij

x_sus, y_sus

Coordonatele ptratului de pe linia i i coloana j sunt:
230 8. Principiul lui Dirichlet

x
ij
= x_sus+latura*(j-1)
y
ij
= y_sus+latura*(i-1)

n paralel cu rezolvarea propriu-zis a problemei se realizeaz desenarea numerelor
n ptratele corespunztoare. Cnd se completeaz un element a[i,j] al matricei, se
afieaz pe ecran numrul respectiv. La umplerea unei linii sau coloane, se scriu din
nou pe ecran numerele care fac parte din soluie, dar colorate diferit.

procedure repartizeaza_deseneaza;
var i,l,j,t,y:Integer;
max,xmax,ymax,ErrCode,gd,gm:Integer;
begin
gd:=Detect; { initializare mod grafic }
InitGraph(gd,gm,'C:\bp\bgi');
desen_retea;
for t:=1 to nr do begin
l:=cauta_linie(x[t]);
if l=m then begin { s-a iesit din matrice pe coloana 1 }
y:=x[t];
pune_numar(m,1,x[t]);
Delay(timp);
SetColor(Red);
{ reafiseaza numerele solutiei cu alta culoare }
pune_numar(m,1,x[t]);
while l>1 do begin
Dec(l);
for j:=1 to a[l,0] do
if y mod a[l,j]=0 then begin
pune_numar(l,j,a[l,j]);
y:=a[l,j];
Break
end;
Delay(timp)
end;
ReadKey;
CloseGraph;
Exit
end else
{ s-a iesit din matrice pe o linie }
if a[l,0]=n-1 then begin
pune_numar(l,n,x[t]);
Delay(1000);
{ reafiseaza numerele din solutie cu alta culoare }
SetColor(Red);

8. Principiul lui Dirichlet 231

for i:=1 to n-1 do
pune_numar(l,i,a[l,i]);
pune_numar(l,n,x[t]);
ReadKey;
CloseGraph;
Exit
end else begin { se repartizeaza elementul in matrice }
Inc(a[l,0]);
a[l,a[l,0]]:=x[t];
pune_numar(l,a[l,0],x[t]);
Delay(timp);
if a[l,0]=1 then
ultima_linie:=l
end
end
end;

8.4.4. Nunta
Fie gr
1
, gr
2
,gr
n
cu gr
i
reprezentnd numrul de rudenii ale persoanei i. Cum exist n
persoane, vom avea 0 gr
i
n 1, i = 1,n. Distingem dou situaii:
a) dac exist o cel puin o persoan care are n 1 rudenii (toat lumea) rezult c
toate persoanele au cel puin o rudenie. Atunci cele n valori din ir sunt numere din
mulimea {1, , n 1}. Conform principiului cutiei, cel puin dou valori sunt
egale.
b) dac nu exist nici o persoan cu n 1 rudenii, cele n valori ale irului sunt cuprin-
se n mulimea {0, 1, 2, , n 2} care are n 1 valori distincte. i n acest caz,
conform principiului cutiei, exist dou valori care sunt egale.
n termenii din teoria grafurilor, considernd persoanele nodurile unui graf neorien-
tat, iar relaiile de rudenie muchiile acestuia, problema se poate enuna astfel:
n orice graf neorientat exist dou noduri care au acelai grad.
Presupunnd c s-au determinat elementele irului gr, algoritmul de determinare a
soluiei este:

Subalgoritmul Determin_pereche(n,gr,p,q):
pentru i=1,n execut:
x[i] 0
sfrit pentru
pentru i=1,n execut:
dac x[gr[i]] 0 atunci
p i { mai exist o persoan cu acelai numr de rudenii }
q x[gr[i]]
scrie p,q
ieire forat din pentru
232 8. Principiul lui Dirichlet

altfel x[gr[i]] i
sfrit dac
sfrit pentru
sfrit subalgoritm

8.4.5. Cifre
Considerm irul numerelor 50, 5050, 505050, , 5050..50.
(n perechi de '50' alipite)
Vom calcula resturile mpririi acestor numere la n i le vom memora n irul rest
i
,
i = 1, 2, ..., n. Dac n acest ir exist un element rest
k
= 0, atunci numrul care d
acest rest prin mprirea la n este numrul cerut n problem. Dac toate elementele
irului sunt nenule, ele aparin mulimii {1, 2, , n 1}.
Conform principiului cutiei lui Dirichlet, cel puin dou dintre ele sunt egale.
Fie j < i cu rest
i
= rest
j
. Atunci diferena dintre numerele care prin mprirea la n
au dat cele dou resturi egale va constitui numrul cerut. Acesta va fi de forma:
505050000000..00 (i j perechi '50' urmate de j perechi '00').

Subalgoritm Determin_multiplu(n):
rest[1] 50 mod n
pentru i=2,n execut:
rest[i] (rest[i-1] * 100 + 50) mod n
dac rest[i] = 0 atunci
scrie i perechi de '50'
ieire forat din program
altfel
j 1
repet
dac rest[j] = rest[i] atunci
scrie i-j perechi de '50' urmate de j perechi '00'
ieire forat din program
altfel
j j + 1
sfrit dac
pn cnd j = i
sfrit dac
sfrit pentru
sfrit subalgoritm

S-ar putea să vă placă și