Documente Academic
Documente Profesional
Documente Cultură
1 Principiul Lui Dirichlet PDF
1 Principiul Lui Dirichlet PDF
8
Principiul cutiei lui Dirichlet
Implementri sugerate
Probleme propuse
Soluiile problemelor
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 a1 < a2 < ... < an+1. Atunci se verific relaia:
0 < a2 a1 < a3 a1 < < an+1 a1 < 2n
Aplicm principiul cutiei pentru numerele a1, a2, ..., an+1, a2 a1, ..., an+1 a1,
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 {a1, a2, ..., an+1} i cellalt mulimii {a2 a1, ..., an+1 a1}. Fie aceste numere
ap i aq a1. Deci ap = aq a1 i atunci aq = ap + a1.
Exemplul 5
Se consider m calculatoare notate cu c1, , cm i n imprimante notate cu p1, , pn,
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 pi o imprimant oarecare. Atunci numrul
minim de legturi necesare spre imprimanta pi este m n + 1. Astfel rmn doar m
(m n +1) = n 1 calculatoare nelegate la pi 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.3.1. Camioane
Considerm un depozit care are n ncperi, coninnd diferite cantiti de marf notate
cu c1, c2, ..., cn.
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 ci, (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 ci 30000, i = 1, 2, , n (ci sunt numere naturale distincte);
Dac exist mai multe soluii, n fiier se va scrie una singur.
Exemplu
CAMION.IN CAMION.OUT
7 3 4 5
31 3 6 17 12 1 8
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 MULTIPLU.OUT
7 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 xi,
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 < xi < 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 NUNTA.OUT
5 2 3
1 3
2 3
1 4
2 5
1 5
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 CIFRE.OUT
7 50505
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:
s1 = c1
s2 = c1 + c2
s3 = c1 + c2 + c3
sn = c1 + c2 + c3 ++ cn
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 resti,
i = 1, 2, ..., n. Dac n acest ir exist un element restk = 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 restp = restq. 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
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.
linia i
latura
Coordonatele ptratului de pe linia i i coloana j sunt:
230 8. Principiul lui Dirichlet
xij = x_sus+latura*(j-1)
yij = y_sus+latura*(i-1)
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
8.4.4. Nunta
Fie gr1, gr2,grn cu gri reprezentnd numrul de rudenii ale persoanei i. Cum exist n
persoane, vom avea 0 gri 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 resti,
i = 1, 2, ..., n. Dac n acest ir exist un element restk = 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 resti = restj. 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