Documente Academic
Documente Profesional
Documente Cultură
=1
.
Valoarea N se obine rezolvnd ecuaia de gradul II S
N
= S (vom avea S
N
S + N) i
rotunjind prin adaos rdcina pozitiv obinut. Avem:
.
2
1 8 1
0 2
2
) 1 (
2
+
=
= +
=
+
S
N
S N N
S
N N
ONI 2002 45
Aadar, valoarea N este:
+
=
2
1 8 1 S
N .
Datorit faptului c N este cea mai mic valoare pentru care suma atinge sau dep-
ete valoarea S, soluia problemei nu poate fi dat de nici un numr N' < N. n cele ce
urmeaz vom demonstra c soluia problemei este dat de N, N + 1 sau N + 2.
Se observ c numerele S
N
, S
N+1
i S
N+2
nu pot avea toate aceeai paritate, deoarece
N + 1 i N + 2 au pariti diferite. Vom nota prin D
N
diferena dintre valoarea S
N
i va-
loarea care trebuie obinut (S). Deoarece se scade aceeai valoare din S
N
, S
N+1
i S
N+2
,
este evident c D
N
, D
N+1
i D
N+2
nu pot avea toate aceeai paritate.
Soluia problemei este dat de indicele celui mai mic numr par dintre aceste trei
numere; fie acest indice N'. Suma total a elementelor crora trebuie s le fie modificat
semnul este D
N'
/ 2. Prin modificarea semnului unui element, valoarea expresiei scade
cu dublul acestui element, deci avem S
N'
D
N'
/ 2 2 = S.
Fie x = D
N'
/ 2 (suma total a elementelor care trebuie sczute). Deoarece N' N +
2, obinem S
N'
S
N
+ N + 1 + N + 2. Folosind relaia S
N
S + N, se obine relaia S
N'
S + 3 N + 3. Cu alte cuvinte, avem:
.
2
3 3
2
3 3 +
' N N
x
Aadar, valoarea x poate fi obinut alegnd doar dou numere cuprinse ntre 1 i N'.
n cazul n care x > N' vom scdea N' i N' x, iar n caz contrar vom scdea doar x.
Analiza complexitii
Valoarea N poate fi obinut folosind o simpl formul matematic, deci ordinul de
complexitate al acestei operaii este O(1).
Valorile S
N
, S
N+1
, S
N+2
, D
N
, D
N+1
, D
N+2
sunt calculate tot cu ajutorul unor formule
matematice simple, aadar ordinul de complexitate al operaiei de determinare a aces-
tora este tot O(1).
Identificarea valorii N' se face pe baza verificrii paritii a cel mult trei numere,
deci i aceast operaie are ordinul de complexitate O(1).
Determinarea valorii x i a celor cel mult dou numere crora li se va modifica
semnul este realizat tot pe baza unor calcule simple al cror ordin de complexitate
este O(1).
n concluzie, ordinul de complexitate al unui algoritm eficient de rezolvare a aces-
tei probleme este O(1) + O(1) + O(1) + O(1) = O(1).
46 Soluiile problemelor propuse la Olimpiadele de Informatic
1.4.4. Becuri
Este evident c pentru a obine prima linie a matricei, conform cerinelor, nu putem
dect fie s comutm toate coloanele pe care trebuie s se afle becuri aprinse i s nu
comutm prima linie, fie s comutm prima linie i s comutm toate coloanele pe
care trebuie s se afle becuri stinse. Analog, pentru prima coloan putem fie s comu-
tm toate liniile pe care trebuie s se afle becuri aprinse i s nu comutm prima co-
loan, fie s comutm prima coloan i s comutm toate liniile pe care trebuie s se
afle becuri stinse. Astfel avem patru posibiliti de a obine configuraia cerut:
comutm liniile crora le corespund becuri aprinse pe prima coloan i coloanele
crora le corespund becuri aprinse pe prima linie;
comutm liniile crora le corespund becuri aprinse pe prima coloan i coloanele
crora le corespund becuri stinse pe prima linie;
comutm liniile crora le corespund becuri stinse pe prima coloan i coloanele
crora le corespund becuri aprinse pe prima linie;
comutm liniile crora le corespund becuri stinse pe prima coloan i coloanele
crora le corespund becuri stinse pe prima linie.
Vom verifica fiecare dintre aceste patru variante i apoi o vom alege pe cea care
implic cele mai puine comutri de linii i coloane.
Dac nici una dintre cele patru variante nu duce la obinerea configuraiei cerute,
putem trage concluzia c aceasta nu poate fi obinut prin comutarea unor linii i a
unor coloane.
Analiza complexitii
Citirea datelor de intrare implic parcurgerea unei matrice ptratice, deci ordinul de
complexitate al acestei operaii este O(N
2
).
Verificarea fiecreia dintre cele patru posibiliti de a obine soluia implic par-
curgerea primei linii i a primei coloane; ordinul de complexitate al unei astfel de par-
curgere este O(N) + O(N) = O(N). Pentru fiecare element este posibil ca linia/coloana
corespunztoare s fie comutat. Operaia de comutare implic traversarea liniei sau
coloanei, aadar are ordinul de complexitate O(N). Ca urmare, ordinul de complexitate
al fiecreia dintre cele patru posibiliti este O(N) O(N) = O(N
2
). ntreaga operaie de
determinare a soluiei are ordinul de complexitate 4 O(N
2
) = O(N
2
).
Scrierea datelor de ieire implic traversarea irurilor care indic dac o linie sau
coloan a fost comutat; ordinul de complexitate al operaiei este O(N).
n concluzie, algoritmul de rezolvare al acestei probleme are ordinul de comple-
xitate O(N
2
) + O(N
2
) + O(N) = O(N
2
).
ONI 2002 47
1.4.5. Discuri
Pentru identificarea discurilor dispensabile va trebui s determinm atingerile dintre
discurile care influeneaz limea figurii. De exemplu, dac avem ase discuri, cu raze
de 1000, 1, 2, 3, 1000, respectiv 500, atunci atingerile care influeneaz limea figurii
sunt ntre primul i al cincilea disc, respectiv ntre al cincilea i al aselea.
Pentru fiecare disc i vom determina, pe rnd, coordonatele orizontale pe care le-ar
avea discul dac ar atinge unul dintre discurile anterioare. n final, vom alege discul
(sau axa Oy) pentru care coordonata orizontal a centrului noului disc este maxim i
putem afirma c discul i ajunge n aceast poziie. Dac discul i va atinge un disc ante-
rior j, atunci discurile cu numerele de ordine cuprinse ntre j + 1 i i 1 sunt
dispensabile.
Dup ce vom lua n considerare toate cele N discuri, vom putea determina numere-
le de ordine ale tuturor discurilor dispensabile.
n final vom verifica dac exist discuri introduse la sfrit care sunt dispensabile.
Pentru aceasta vom determina limea figurii i ultimul disc care o influeneaz. Toate
discurile introduse dup acest disc sunt dispensabile.
Pentru determinarea coordonatei orizontale x
i
a centrului unui disc i care atinge un
disc j avem nevoie de coordonata orizontal x
j
a centrului discului j, precum i de raze-
le r
i
i r
j
ale celor dou discuri.
Dac aceste trei valori sunt cunoscute, se poate folosi urmtoarea formul pentru a
determina coordonata orizontal a centrului discului j:
2 2
) ( ) (
j i j i i j
r r r r x x + + =
.
Analiza complexitii
Pentru fiecare disc i care este introdus, se determin posibila coordonat x
i
datorat
atingerii cu toate cele i 1 discuri inserate anterior. Pentru cele N discuri se vor de-
termina, n total, N (N + 1) / 2 coordonate, deci ordinul de complexitate al acestei
operaii este O(N
2
).
La fiecare pas, pot fi marcate ca dispensabile cel mult toate discurile inserate ante-
rior, aadar ordinul de complexitate al acestei operaii este tot O(N
2
).
Determinarea limii figurii i a cercurilor dispensabile de la sfritul secvenei ne-
cesit o singur parcurgere a irului care pstreaz coordonatele centrelor discurilor,
ceea ce implic ordinul de complexitate O(N).
Afiarea cercurilor dispensabile, precum i citirea razelor cercurilor sunt operaii
care se efectueaz n timp liniar, necesitnd o simpl parcurgere a unor iruri.
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(N
2
) + O(N
2
) + O(N) + O(N) + O(N) = O(N
2
).
48 Soluiile problemelor propuse la Olimpiadele de Informatic
1.4.6. Cod
Din condiiile precizate n enun rezult c, pe baza unei mulimi de litere distincte, se
poate construi un singur cuvnt care respect condiiile date, i anume cel care conine
literele ordonate lexicografic. Aadar, oricrei mulimi de cel mult zece litere distincte
i corespunde un cuvnt care respect condiiile din enun. Se poate afirma c un cu-
vnt este o submulime a mulimii literelor; de aici rezult c numrul cuvintelor for-
mate din k litere este
k
C
26
. Mai mult, numrul cuvintelor formate din k dintre ultimele
n litere ale alfabetului este
k
n
C
.
Numrul de ordine al cuvntului dat este mai mare dect cel al codurilor formate
din mai multe cifre. Din aceste motive, pentru un cuvnt format din k litere, vom avea
un cod mai mare dect
=
k
i
i
C
1
26
.
n continuare, pentru prima liter a cuvntului, va trebui s gsim numrul cuvinte-
lor care ncep cu o liter mai mic (din punct de vedere lexicografic). n cazul n care
cuvntul are k litere, vor exista
1
25
k
C
cuvinte valide care ncep cu 'a',
1
24
k
C
cuvinte va-
lide care ncep cu 'b' etc. n general, vor exista
1
26
k
i
C
cuvinte valide care ncep cu a i-a
liter a alfabetului. Dac prima liter a cuvntului este cea de-a n-a liter a alfabetului,
vom avea
n
i
k
i
C
1
1
26
cuvinte valide care ncep cu o liter mai mic.
n acest moment tim numrul de ordine minim al unui cuvnt care ncepe cu prima
liter a cuvntului dat. Pentru a doua liter vom proceda ntr-o manier asemntoare.
Singura diferen este dat de faptul c a doua liter trebuie s fie strict mai mare dect
prima. Aadar, dac prima liter este cea de-a n-a a alfabetului, iar a doua este cea de-a
m-a, atunci vom avea
+ =
1
1
2
26
m
n i
k
i
C
cuvinte care au pe prima poziie aceeai liter, iar pe
cea de-a doua poziie o liter mai mic.
Procedeul va continua pentru fiecare liter n parte. n cazul n care litera curent
este cea de-a p-a a cuvntului, este a m-a liter a alfabetului, iar litera anterioar este a
n-a liter a alfabetului, numrul de cuvinte care au pe primele p 1 poziii aceleai
litere ca i cuvntul dat, iar pe cea de-a p-a poziie o liter mai mic, este dat de for-
mula
+ =
1
1
26
m
n i
p k
i
C
.
Adunnd toate valorile obinute pe parcurs vom obine numrul cuvintelor care se
afl naintea cuvntului dat. Adunnd 1 la aceast valoare, vom obine numrul de or-
dine al cuvntului.
ONI 2002 49
Analiza complexitii
Pentru a analiza complexitatea acestui algoritm va trebui s precizm faptul c num-
rul literelor din alfabet este constant, deci nu poate interveni n exprimarea ordinului
de complexitate. Acesta va fi stabilit doar n funcie de lungimea k a cuvntului.
Iniial se calculeaz suma
=
k
i
i
C
1
26
, operaie realizabil n timp liniar, avnd n vede-
re observaia anterioar. Aadar, primul pas al algoritmului are ordinul de complexita-
te O(k).
Pentru fiecare liter a cuvntului se calculeaz suma
+ =
1
1
2
26
m
n i
k
i
C
, unde variabilele au
semnificaia prezentat anterior. Numrul de litere este implicat n determinarea valo-
rii combinrii. Aadar, calculul combinrii se realizeaz n timp liniar. Numrul de
combinri calculate nu depinde de lungimea cuvntului, deci ordinul de complexitate
al calculrii acestei sume este O(k). n total vor fi calculate k astfel de sume, deci ordi-
nul de complexitate al celui de-al doilea pas al algoritmului este O(k) O(k) = O(k
2
).
Citirea datelor de intrare i scrierea celor de ieire se realizeaz cu ajutorul unor
operaii elementare, deci putem considera c au ordinul de complexitate O(1).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(k) + O(k
2
) + O(1) = O(k
2
), avnd n vedere c numrul literelor din alfabetul
englez este constant.
1.4.7. Hotel
Pentru nceput, vom determina numrul de etaje la care exist angajai i vom atribui
fiecrui etaj cte o culoare. Pe msur ce citim datele referitoare la angajai, vom veri-
fica dac etajul la care lucreaz angajatul are asociat o culoare i, dac este cazul, i
vom atribui o culoare i vom crete numrul etajelor distincte. Dac ajungem n situa-
ia n care numrul culorilor disponibile este mai mic dect numrul etajelor distincte,
atunci problema nu are soluie. Atribuind cte o culoare fiecrui etaj, practic, am re-
zolvat cea de-a doua parte a problemei.
Pentru prima parte vom considera c avem la dispoziie n culori i exist k etaje
distincte la care lucreaz angajai. Va trebui s determinm numrul de posibiliti de
a atribui celor k etaje cte o culoare, astfel nct fiecare etaj s aib propria sa culoare.
Practic, avnd la dispoziie o mulime format din n elemente va trebui s determi-
nm cte posibiliti de alegere a k dintre aceste elemente exist. Este foarte uor de
observat c, de fapt, propoziia anterioar reprezint definiia noiunii matematice de
aranjamente. Aadar, soluia primei pri a problemei este dat de formula:
. ) 1 ( ) 2 ( ) 1 (
)! (
!
n n k n k n
k n
n
A
k
n
+ + =
= L
50 Soluiile problemelor propuse la Olimpiadele de Informatic
Datorit faptului c se obin numere foarte mari, nu se pot folosi tipurile de date
puse la dispoziie de limbajele de programare pentru operaii aritmetice. Se observ c,
folosind formula anterioar, avem nevoie doar de nmuliri dintre un numr mare i un
numr cel mult egal cu 200. Ca urmare, va trebui s implementm operaia de nmuli-
re a unui numr mare cu un scalar. Pentru a mri viteza de execuie a programului i a
utiliza mai eficient memoria, se poate folosi baza 10000 pentru efectuarea calculelor.
Analiza complexitii
Citirea datelor de intrare se realizeaz n timp liniar, deci ordinul de complexitate al
acestei operaii este O(n).
Verificarea faptului c unui etaj i corespunde o culoare i eventuala atribuire a unei
culori se realizeaz n timp constant. Deoarece aceast operaie se realizeaz pentru
etajul corespunztor fiecrui angajat, stabilirea corespondenei dintre etaje i culori se
realizeaz ntr-un timp cu ordinul de complexitate O(n) O(1) = O(n).
Calcularea numrului de modaliti de alegere a culorilor implic folosirea numere-
lor mari. Se observ c numrul de cifre (n baza 10000) al rezultatului este mai mic
dect 100, aadar putem considera c o nmulire se realizeaz n timp liniar. Numrul
nmulirilor efectuate este k, deci ordinul de complexitate al operaiei de determinare a
rezultatului este O(k).
Afiarea numrului de modaliti este realizat n timp constant, iar operaia de afi-
are a culorilor corespunztoare fiecrui angajat are ordinul de complexitate O(n).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(n) + O(n) + O(k) + O(1) + O(n) = O(k + n).
1.4.8. Lac
Pentru rezolvarea acestei probleme vom folosi o variant puin modificat a algorit-
mului lui Lee. Pentru fiecare poziie a matricei care reprezint o zon mltinoas vom
determina numrul minim de pontoane care trebuie s fie amplasate pentru a se ajunge
n poziia respectiv.
Pentru aceasta vom considera c pentru a ajunge n imediata vecintate a primei
linii a matricei numrul de pontoane necesare este 0. Pentru o anumit poziie, num-
rul de pontoane necesare ajungerii n punctul respectiv este dat de cel mai mic numr
corespunztor uneia dintre poziiile nvecinate la care se adaug, eventual, un ponton
dac poziia nu corespunde unei poriuni de uscat.
Dup o astfel de parcurgere a matricei, vom avea pentru fiecare poziie a matricei o
anumit valoare, dar nu suntem siguri c aceasta este cea minim. Vom parcurge suc-
cesiv matricea ncercnd s mbuntim valorile obinute. O valoare va fi modificat
dac se poate ajunge n poziia curent dintr-o poziie nvecinat i se obine un numr
mai mic de pontoane pentru poziia curent. n momentul n care nu va mai exista nici
o parcurgere care s aduc mbuntiri, am obinut rezultatul final.
ONI 2002 51
Practic cele dou tipuri de parcurgeri pot fi "asimilate" n una singur dac, iniial,
se marcheaz toate poziiile matricei cu o valoare suficient de mare. De fiecare dat
cnd are loc o mbuntire, vom pstra direcia din care s-a ajuns n poziia curent
pentru a putea reconstitui drumul.
n final, numrul minim de pontoane va fi dat de cea mai mic valoare de pe ultima
linie a matricei. Pentru reconstituirea drumului, se va porni n sens invers, de pe pozi-
ia de pe ultima linie n poziia din care s-a ajuns n ea i aa mai departe, pn se
ajunge pe prima linie. Dac se ajunge ntr-o poziie care nu corespunde unei zone de
uscat, atunci va trebui amplasat un ponton n acea poziie.
Analiza complexitii
Citirea datelor de intrare implic o traversare a matricei, ordinul de complexitate al
acestei operaii fiind O(m n).
O parcurgere a matricei n vederea realizrii unei mbuntiri are acelai ordin de
complexitate. Datorit faptului c, dup prima parcurgere, suntem siguri c se poate
ajunge pe ultima linie folosind m pontoane (completarea integral a coloanei), nu se
vor realiza n nici o situaie mai mult de m parcurgeri de mbuntire. Din aceste mo-
tive, ordinul de complexitate al operaiei de determinare a numrului de pontoane ne-
cesare pentru ajungerea n fiecare poziie este O(m) O(m n) = O(m
2
n).
Determinarea valorii minime de pe ultima linie se realizeaz n timp liniar, ordinul
de complexitate fiind O(n).
Reconstituirea drumului ar putea, teoretic, s necesite traversarea ntregii matrice.
Astfel, n cel mai defavorabil caz, ordinul de complexitate al acestei operaii este O(m
n).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(m n) + O(m
2
n) + O(n) + O(m n) = O(m
2
n).
1.4.9. Logic
Pentru nceput vom observa c, pentru ca trasarea s fie posibil, fiecare zon trebuie
s fie delimitat de un numr par de segmente. Aceasta se datoreaz faptului c linia
trebuie s intre i s ias din fiecare zon de un anumit numr de ori.
Aadar, pentru fiecare zon va trebui s numrm segmentele (aa cum sunt defini-
te ele n enun) care o delimiteaz i s verificm dac numrul obinut este par sau
impar. n momentul n care gsim o zon delimitat de un numr par de segmente,
vom ti c trasarea nu este posibil. Dac toate zonele sunt delimitate de un numr par
de segmente, atunci trasarea este posibil.
Numrarea segmentelor care delimiteaz o zon se realizeaz pe baza unui algo-
ritm de umplere. n momentul n care ajungem la un punct de la marginea zonei, se
pune problema creterii numrului de segmente. Exist mai multe situaii n care nu-
mrul de segmente va crete:
52 Soluiile problemelor propuse la Olimpiadele de Informatic
se ajunge n partea de sus a zonei, iar punctul aflat imediat deasupra i cel din
dreapta acestuia fac parte din zone diferite;
se ajunge n partea de jos a zonei, iar punctul aflat imediat dedesubt i cel din
dreapta acestuia fac parte din zone diferite;
se ajunge n partea din stnga a zonei, iar punctul aflat imediat la stnga i cel de
deasupra sa fac parte din zone diferite;
se ajunge n partea din dreapta a zonei, iar punctul aflat imediat la dreapta i cel de
deasupra sa fac parte din zone diferite;
se ajunge ntr-unul din colurile zonei.
Dac ultima condiie este ndeplinit simultan cu una dintre primele patru, numrul
segmentelor va crete doar cu 1. Creterile datorate primelor patru condiii sunt cumu-
lative.
Analiza complexitii
Vom studia acum complexitatea algoritmului pentru un desen. Citirea datelor de intra-
re implic o traversare a matricei, deci aceast operaie se realizeaz ntr-un timp de
ordinul O(n
2
).
La fiecare pas al algoritmului de umplere se numr segmentele care trebuie adu-
gate pentru poziia curent. Se pot aduga cel mult patru segmente, aadar ordinul de
complexitate al operaiei este O(1). Algoritmul de umplere implic parcurgerea inte-
gral a matricei, motiv pentru care vor fi vizitate toate cele n
2
poziii. Aadar, algorit-
mul de verificare a posibilitii de trasare a liniei are ordinul de complexitate O(n
2
)
O(1) = O(n
2
).
Datele de ieire constau din scrierea unui singur mesaj, deci aceast operaie se
efectueaz n timp liniar.
n concluzie, algoritmul de rezolvare a acestei probleme, pentru un desen, are ordi-
nul de complexitate O(n
2
) + O(n
2
) + O(1) = O(n
2
).
Pentru a stabili ordinul de complexitate al algoritmului de rezolvare a ntregii pro-
bleme, vom considera c un set de date cuprinde t desene. Aadar, ordinul de comple-
xitate este O(t) O(n
2
) = O(n
2
t).
1.4.10. Foto
Se observ foarte uor c exist doar nou posibiliti de lipire a patru fotografii pe o
pagin, indiferent de dimensiunile acestora. Toate celelalte posibiliti sunt echivalen-
te cu una dintre cele nou, ele obinndu-se prin translatri sau oglindiri. Cele nou
aranjamente posibile pe care le vom lua n considerare sunt prezentate n figura urm-
toare.
ONI 2002 53
Modaliti de amplasare
Va trebui s alegem poziiile celor patru fotografii pentru fiecare dintre cele nou
configuraii. Teoretic, pentru fiecare dintre cele nou configuraii, exist 4! = 24 posi-
biliti. Practic, se observ c exist i n acest caz configuraii echivalente. De exem-
plu, pentru prima i a doua configuraie, nu conteaz ordinea n care sunt aezate foto-
grafiile, pentru a treia configuraie nu conteaz ordinea n care sunt dispuse cele trei
poze de pe a doua coloan etc. Practic, pentru fiecare configuraie vom avea 1, 2, 4, 6
sau 12 posibiliti.
Cu excepia ultimei configuraii, n toate celelalte exist o fotografie care ocup o
ntreag latur a paginii. Cunoscnd raportul dintre lungimea i limea sa se determi-
n laturile spaiului liber rmas pe foaie. n continuare, una dintre laturile spaiului
este ocupat integral de o fotografie. Procedura continu pn determinm dimensiunile
tuturor fotografiilor. n final se verific dac foaia este acoperit integral. Pentru ulti-
ma configuraie vom alege, pe rnd, dimensiunile posibile ale fotografiei din colul din
stnga-sus i dimensiunile celorlalte fotografii vor fi determinate n acelai mod ca i
n situaiile anterioare.
Analiza complexitii
Citirea datelor se realizeaz n timp constant, deoarece numrul fotografiilor este n-
totdeauna 4. Studierea primelor opt configuraii se realizeaz, de asemenea, n timp
constant, deoarece numrul posibilitilor de amplasare a fotografiilor respectnd con-
figuraiile considerate este constant.
Pentru cea de-a noua configuraie putem avea cel mult min(X, Y) dimensiuni posi-
bile ale primei fotografii, unde X i Y sunt dimensiunile paginii. Dac notm cu n acest
minim, ordinul de complexitate al acestei operaii va fi O(n).
Datele de ieire constau n exact opt numere, deci scrierea rezultatelor se realizeaz
n timp constant.
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(1) + 8 O(1) + O(n) + O(1) = O(n).
54 Soluiile problemelor propuse la Olimpiadele de Informatic
1.4.11. Balan
Se observ c suma momentelor greutilor este cuprins ntre -6000 i 6000 (dac avem
20 de greuti cu valoarea 20 i acestea sunt amplasate pe cel mai ndeprtat crlig fa
de centrul balanei, atunci modulul sumei momentelor forelor este 15 20 20 = 6000).
Ca urmare, putem pstra un ir a ale crui valori a
i
vor conine numrul posibilitilor ca
suma momentelor greutilor s fie i. Indicii irului vor varia ntre -6000 i 6000. Pentru
a mbunti viteza de execuie a programului, indicii vor varia ntre -300 g i 300 g,
unde g este numrul greutilor. Pot fi realizate mbuntiri suplimentare dac se deter-
min distanele maxime fa de mijlocul balanei ale celor mai ndeprtate crlige de pe
cele dou talere i suma total a greutilor. Dac distanele sunt d
1
i d
2
, iar suma este s,
atunci indicii vor varia ntre -d
1
s i d
2
s.
Iniial, pe balan nu este agat nici o greutate, aadar suma momentelor greuti-
lor este 0. Ca urmare, iniial valorile a
i
vor fi 0 pentru orice indice nenul i a
0
= 1
(exist o posibilitate ca iniial suma momentelor greutilor s fie 0 i nu exist nici o
posibilitate ca ea s fie diferit de 0).
n continuare, vom ncerca s amplasm greutile pe crlige. Fiecare greutate poa-
te fi amplasat pe oricare dintre crlige. S presupunem c la un moment dat exist a
i
posibiliti de a obine suma i. Dac vom amplasa o greutate de valoare g pe un crlig
aflat la distana d fa de centrul balanei, suma momentelor greutilor va crete sau
va scdea cu g d (n funcie de braul pe care se afl crligul). Ca urmare, dup am-
plasarea noii greuti exist a
i
posibiliti de a obine suma i + g d. Considerm c
irul b va conine valori care reprezint numrul posibilitilor de a obine sume ale
momentelor forelor dup amplasarea greutii curente. nainte de a testa posibilitile
de plasare a greutii, irul b va conine doar zerouri. Pentru fiecare pereche (i, d), va-
loarea b
i
+ g d va crete cu a
i
. Dup considerarea tuturor perechilor, vom putea trece
la o nou greutate. Valorile din irul b vor fi salvate n irul a, iar irul b va fi reiniia-
lizat cu 0. Rezultatul final va fi dat de valoarea a
0
obinut dup considerarea tuturor
greutilor disponibile.
Analiza complexitii
Pentru studiul complexitii vom nota numrul greutilor cu g, iar cel al crligelor cu c.
Citirea datelor de intrare corespunztoare crligelor i greutilor se realizeaz n
timp liniar, deci ordinul de complexitate al acestor operaii este O(g), respectiv O(c).
Singura mrime care nu este considerat constant i de care depinde numrul de
posibiliti de a obine sumele este numrul greutilor. Aadar, vom considera c or-
dinul de complexitate al traversrii irului a este O(g). Numrul de traversri este dat
tot de numrul greutilor disponibile, deci vom avea O(g) traversri. n timpul traver-
srii vom considera toate crligele pentru fiecare element al irului. Ca urmare, ordinul
de complexitate al operaiilor efectuate asupra unui element ntr-o parcurgere este
O(c). Rezult c ordinul de complexitate al unei parcurgeri este O(g) O(c) = O(g c),
ONI 2002 55
n timp ce ordinul de complexitate al ntregii operaii care duce la obinerea rezultatu-
lui este O(g) O(g c) = O(g
2
c).
Afiarea numrului de posibiliti de a echilibra balana se realizeaz n timp con-
stant.
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(c) + O(g) + O(g
2
c) + O(1) = O(g
2
c).
1.4.12. Aliniere
Pentru fiecare soldat vom determina cel mai lung subir strict cresctor (din punct de
vedere al nlimii) de soldai care se termin cu el, respectiv cel mai lung subir strict
descresctor de soldai care urmeaz dup el. Dup aceast operaie, vom determina
soldatul pentru care suma lungimilor celor dou iruri este maxim.
Chiar dac s-ar prea c n acest mod am gsit soluia problemei, mai exist o posi-
bilitate de a mri numrul soldailor care rmn n ir. S considerm soldatul cel mai
nalt n irul rmas (cel cruia i corespunde suma maxim). Acesta poate privi fie spre
stnga, fie spre dreapta irului. Din aceste motive, la stnga sau la dreapta sa poate s
se afle un soldat de aceeai nlime; unul dintre cei doi va privi spre dreapta, iar cel-
lalt spre stnga. Totui, nu putem alege orice soldat cu aceeai nlime, ci doar unul
pentru care lungimea irului strict cresctor (dac se afl spre stnga) sau a celui strict
descresctor (dac se afl spre dreapta) este aceeai cu lungimea corespunztoare iru-
lui strict cresctor, respectiv strict descresctor, corespunztoare celui mai nalt soldat
dintre cei rmai n ir.
Dup identificarea celor doi soldai de nlimi egale (sau demonstrarea faptului c
nu exist o pereche de acest gen care s respecte condiiile date) se marcheaz toi sol-
daii din cele dou subiruri. Ceilali soldai vor trebui s prseasc formaia.
Analiza complexitii
Citirea datelor de intrare se realizeaz n timp liniar, deci ordinul de complexitate al
acestei operaii este O(n).
Chiar dac exist algoritmi eficieni (care ruleaz n timp liniar-logaritmic) de de-
terminare a celui mai lung subir ordonat, timpul de execuie admis ne permite folosi-
rea unui algoritm simplu, cu ordinul de complexitate O(n
2
). Acesta va fi aplicat de do-
u ori, dup care se va cuta valoarea maxim a sumei lungimilor irurilor corespunz-
toare unui soldat; aadar identificarea soldatului care poate privi n ambele direcii este
o operaie cu ordinul de complexitate O(n
2
) + O(n
2
) + O(n) = O(n
2
).
Urmeaz eventuala identificare a unui alt soldat de aceeai nlime care respect
condiiile referitoare la lungimile subirurilor. Pentru aceasta se parcurge irul soldai-
lor de la soldatul identificat anterior spre extremiti; operaia necesit un timp liniar.
Determinarea celor dou subiruri se realizeaz n timp liniar dac, n momentul con-
struirii celor dou subiruri, se pstreaz predecesorul, respectiv succesorul fiecrui
soldat. n timpul parcurgerii subirurilor sunt marcai soldaii care rmn n formaie.
56 Soluiile problemelor propuse la Olimpiadele de Informatic
Pentru scrierea datelor de ieire se parcurge irul marcajelor i sunt identificai sol-
daii care prsesc formaia. Ordinul de complexitate al acestei operaii este O(n).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(n) + O(n
2
) + O(n) + O(n) + O(n) = O(n
2
).
1.4.13. Arbore
Vom spune c un nod este rezolvat dac i numai dac el face parte din exact un ciclu.
Similar, vom spune c un subarbore este rezolvat dac i numai dac toate nodurile
acestuia sunt rezolvate.
Vom numi fir un subarbore care este lan (fiecare nod, cu excepia frunzei, are un
singur fiu). Un fir este ilustrat n figura 1.
Fig. 1: Un fir
Se observ c un fir poate fi rezolvat foarte simplu prin unirea rdcinii sale cu
frunza sa. Evident, firul va putea fi rezolvat numai dac el conine cel puin dou no-
duri. Procedeul este ilustrat n figura 2.
Fig. 2: Un fir rezolvat
Pentru a rezolva aceast problem vom alege, pentru nceput, un nod care va fi r-
dcina arborelui. Vom spune c un subarbore este potenial rezolvabil dac toi fiii
rdcinii subarborelui (n numr de cel puin doi) sunt rdcini ale unor fire.
n continuare vom arta modul n care poate fi rezolvat un nod potenial rezolvabil.
Vom alege cele mai scurte dou fire (acestea pot conine unul, dou sau mai multe
ONI 2002 57
noduri) i vom uni printr-o muchie frunzele acestor fire. Astfel vom obine un ciclu
care va conine nodurile din componena celor dou fire, precum i nodul potenial
rezolvabil. Eventualele fire rmase (dac sunt formate din cel puin trei noduri) vor fi
rezolvate aa cum s-a artat n figura anterioar. Se observ c, n cazul n care exist
mai mult de dou fire care conin unul sau dou noduri, subarborele nu poate fi rezol-
vat i problema nu are soluie. Rezolvarea unui subarbore potenial rezolvabil este
ilustrat n figura 3.
Fig. 3: Rezolvarea unui subarbore potenial rezolvabil
Dup rezolvarea unui subarbore, acesta este eliminat din arbore i se va alege un alt
nod potenial rezolvabil. Procedeul continu pn la rezolvarea tuturor nodurilor sau
pn la detectarea unui subarbore care nu poate fi rezolvat.
n cele ce urmeaz vom prezenta modul n care poate fi implementat algoritmul
descris. Pentru nceput vom alege o modalitate de reprezentare a arborelui. Vom con-
strui o list de fii i vom pstra, pentru fiecare nod, indicele primului i al ultimului fiu
n aceast list. Prin convenie, vom considera c pentru un nod care nu are nici un fiu
(frunz) indicele ultimului fiu va fi mai mic dect indicele primului fiu; de asemenea,
pentru fiecare nod vom pstra nodul printe. Datorit faptului c arborele este dat prin
irul muchiilor, va trebui s l construim. Pentru aceasta vom realiza o parcurgere n
lime a arborelui, ceea ce permite construirea listei fiilor pe msura traversrii noduri-
lor arborelui.
n continuare vom alege rdcina arborelui; aceasta poate fi orice nod care are gra-
dul mai mare dect 1. Vom continua cu identificarea fiilor; evident, toate frunzele sunt
fire de lungime 1. Pentru fiecare frunz vom "urca n arbore" atta timp ct nodul cu-
rent are un singur fiu (printele frunzei va fi rdcina unui fir de lungime 2, printele
printelui va fi rdcina unui fir de lungime 3 i aa mai departe). Folosind acest pro-
cedeu vom determina i lungimile firelor. Prin convenie, vom considera c dac un
nod nu face parte dintr-un fir, atunci lungimea corespunztoare va fi -1.
Acum, la fiecare pas vom cuta un nod care conine cel puin doi fii nerezolvai
care sunt rdcini ale unor fire. Vom determina numrul firelor de lungime 1 sau 2 i,
58 Soluiile problemelor propuse la Olimpiadele de Informatic
n cazul n care exist cel mult dou astfel de fire, vom rezolva subarborele aa cum se
arat n figura 3. Dac exist mai mult de dou astfel de fire vom scrie n fiierul de
ieire valoarea -1 i vom opri execuia programului. Dup rezolvarea subarborelui,
acesta este eliminat din arbore prin marcarea tuturor nodurilor sale ca fiind rezolvate.
Acum printele rdcinii subarborelui ar putea s fac parte dintr-un fir. n cazul n
care printele a rmas cu un singur fiu care este rdcin a unui fir, atunci printele
devine rdcin a unui fir de lungime cu 1 mai mare. Vom "urca" din nou n arbore
pn la ntlnirea unui nod care are mai muli fii nerezolvai i vom pstra, pentru fie-
care nod, lungimea firului cu rdcina n nodul respectiv. O a doua posibilitate este ca
printele rdcinii subarborelui eliminat s devin frunz. Se va "urca" n arbore n
mod asemntor, dar noua frunz va fi rdcina unui fir de lungime 1.
Exist posibilitatea ca, la un moment dat, s rmnem cu un arbore format dintr-un
singur fir. Dac acesta are lungimea mai mare dect 2, atunci el va fi rezolvat aa cum
se arat n figura 2. n caz contrar, problema nu are soluie.
De fiecare dat cnd rezolvm un subarbore, vom pstra o list cu muchiile adu-
gate. n final, vom scrie n fiierul de ieire numrul muchiilor adugate, precum i
extremitile muchiilor din list.
Analiza complexitii
Citirea datelor de intrare se realizeaz n timp liniar, deoarece implic citirea extremi-
tilor celor N 1 muchii ale arborelui.
Construirea arborelui prin parcurgerea n lime implic, pentru fiecare nod par-
curs, studierea tuturor muchiilor. Deoarece avem N noduri i N 1 muchii, ordinul de
complexitate al operaiei este O(N
2
). Pe parcursul construirii arborelui se creeaz irul
prinilor, cel al fiilor, cel al gradelor, precum i cele care pstreaz indicii primului i
ultimului fiu pentru fiecare nod.
Pentru pstrarea informaiilor iniiale despre fire, vom parcurge, n cel mai defavo-
rabil caz, toate nodurile arborelui, deci operaia se realizeaz n timp liniar. Trebuie
observat faptul c acest ordin de complexitate include i timpul consumat pentru actu-
alizarea necesar dup eliminarea unui nod din arbore.
Alegerea unui nod potenial rezolvabil implic traversarea listei fiilor pentru a veri-
fica dac sunt rdcini ale unor fire, deci ordinul su de complexitate este O(N). La
fiecare pas vom elimina cel puin trei noduri, deci vom realiza cel mult N / 3 astfel de
cutri. Ca urmare, ordinul de complexitate al tuturor alegerilor este O(N
2
).
Pentru rezolvarea arborelui este necesar parcurgerea tuturor nodurilor acestuia. Un
nod rezolvat nu va fi parcurs nc o dat. Aadar, ordinul de complexitate al acestei
operaii este O(N).
Ordinul de complexitate al operaiilor de eliminare a nodurilor este tot O(N) pentru
c fiecare nod este eliminat o singur dat.
Scrierea datelor n fiierul de ieire se realizeaz tot n timp liniar pentru c implic
scrierea extremitilor a cel mult N / 3 muchii.
ONI 2002 59
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexi-
tate O(N) + O(N
2
) + O(N) + O(N
2
) + O(N) + O(N) + O(N) = O(N
2
).
1.4.14. Decodificare
Iniial vom determina numrul de poziii n care permutarea identic i permutarea
care trebuie determinat coincid.
n continuare vom ncerca s determinm poziiile n permutare ale tuturor numere-
lor cuprinse ntre 1 i N. Pentru fiecare numr i, dac poziia sa nu a fost determinat
la un pas anterior, va trebui s determinm poziia acestuia n permutarea cutat. Pen-
tru aceasta, n permutarea identic, vom interschimba, pe rnd, numrul i cu fiecare
dintre celelalte elemente. Astfel, vom obine permutri de forma (1, 2, 3, ..., i - 1, j, i +
1, ..., j - 1, i, j + 1, ..., N). Numrul poziiilor, n care aceast permutare i permutarea
care trebuie considerat coincid, poate crete dac i numai dac numrul i ajunge pe
poziia sa sau numrul care trebuie s se afle pe poziia i ajunge n aceast poziie.
Aadar, pentru doar dou dintre aceste permutri numrul poziiilor considerate poate
s creasc. Exist trei cazuri:
Numrul poziiilor care coincid nu crete n nici un caz. n aceast situaie putem
trage concluzia c numrul i se afl deja pe poziia sa, deci va fi al i-lea element n
permutarea care trebuie determinat.
Numrul poziiilor care coincid crete o singur dat. Fie j numrul cu care a fost
interschimbat i n permutarea care a dus la creterea numrului de poziii care co-
incid. Este uor de observat c, n permutarea care trebuie determinat, numrul i
se va afla pe poziia j, iar numrul j se va afla pe poziia i.
Numrul poziiilor care coincid crete de dou ori. Fie j i k poziiile pe care a
ajuns numrul i n cele dou permutri. Va trebui s determinm pe care dintre
aceste dou poziii se afl i n permutarea care trebuie determinat. tim cu sigu-
ran c unul dintre numerele j i k se afl pe poziia i n permutarea care trebuie
determinat. Va trebui s studiem dou cazuri:
i trece pe poziia j, j pe poziia k i k pe poziia i;
i trece pe poziia k, j pe poziia i i k pe poziia j.
n unul dintre aceste dou cazuri numrul poziiilor care coincid va fi cu cel puin
2 mai mare dect numrul poziiilor care coincid n permutarea identic. Aadar, vom
verifica una dintre permutri; dac numrul poziiilor care coincid crete cu cel puin
2, atunci vom ti care este poziia numrului i n permutarea care trebuie determinat
i care este numrul care se afl pe poziia i n aceast permutare.
Dup determinarea poziiilor tuturor numerelor, vom afia permutarea determinat.
60 Soluiile problemelor propuse la Olimpiadele de Informatic
Analiza complexitii
Pentru nceput, trebuie precizat faptul c apelul funciei Check implic traversarea
unui vector cu N elemente care conine permutarea care trebuie determinat. Aadar
ordinul de complexitate al unui astfel de apel este O(N).
Preluarea dimensiunii irului se realizeaz n timp constant, deci are ordinul de
complexitate O(1).
Identificarea poziiei unui numr implic realizarea a cel mult N 1 interschimbri
i, eventual, a unei permutri care va diferi de permutarea identic n trei poziii. Pen-
tru fiecare dintre aceste permutri se va realiza un apel al funciei Check, deci operaia
de determinare a poziiei unui numr n permutarea cutat are ordinul de complexita-
te O(N) O(N) = O(N
2
). n total, vom efectua cel mult N determinri, deci ordinul de
complexitate al operaiei de determinare a permutrii cutate este O(N) O(N
2
) =
O(N
3
).
Scrierea datelor n fiierul de ieire implic traversarea permutrii determinate, deci
ordinul de complexitate al operaiei este O(N).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(1) + O(N
3
) + O(N) = O(N
3
).
1.4.15. Seti
Pentru a determina numrul de apariii ale cuvintelor din dicionar n mesajul dat, vom
ordona alfabetic toate irurile (cuvintele) de 16 caractere consecutive din mesaj. Apoi,
pentru fiecare cuvnt din dicionar vom determina, prin metoda cutrii binare, prima
i ultima apariie a cuvntului n irul sortat. Evident, dac un cuvnt din dicionar
conine k litere, atunci, n momentul n care determinm aceste dou poziii, vom lua
n considerare doar primele k litere ale irurilor.
O prim observaie ar fi c, datorit faptului c nu avem suficient memorie la
dispoziie, irul sortat trebuie s conin indici i nu cuvinte propriu-zise. Astfel, al i-
lea element al irului sortat va conine poziia la care ncepe al i-lea cuvnt n irul sor-
tat.
Datorit limitei de timp foarte stricte, algoritmii clasici de sortare (quicksort,
heapsort) nu sunt suficient de performani. Pentru aceast problem este recomandabi-
l folosirea algoritmului radixsort.
O alt dificultate care apare este datorat tot insuficienei memoriei. irul sortat de
indici ar trebui s conin numere reprezentate pe patru octei (teoretic ar fi suficieni
trei) deoarece textul poate conine peste 100000 de cuvinte. Pentru a evita aceast pro-
blem, vom mpri textul n patru blocuri i vom aplica algoritmul descris pentru fie-
care dintre ele. Fiecare bloc va conine cel mult 2
15
= 32768 litere. Datorit faptului c
numrul de litere este cel mult 2047 64 = 131008 < 2
17
= 131072, sunt suficiente pa-
tru blocuri. Vom avea i patru iruri sortate, dar fiecare element al acestor iruri va
putea fi reprezentat pe doi octei.
ONI 2002 61
Datorit mpririi textelor n blocuri apar probleme pentru cuvintele care fac parte
din dou blocuri. Pentru a le evita, vom face n aa fel nct ultimele 15 litere dintr-un
bloc s fie adugate ca primele 15 litere ale blocului urmtor. Dimensiunea total a
textului va crete cu pn la 45 de caractere, dar va ajunge doar la cel mult 131053 <
2
17
, deci nu apar blocuri suplimentare. Se observ c la nceputul celui de-al doilea
bloc sunt copiate 15 litere din primul, deci ultimele 15 litere ale acestui al doilea grup
trebuie s fie mutate n al treilea. Alte 15 litere ajung s fie ultimele n al doilea bloc,
deci trebuie copiate n al treilea. Aadar, la nceputul celui de-al treilea bloc vor fi ul-
timele 30 de litere ale celui de-al doilea bloc. Folosind acelai raionament, ajungem la
concluzia c la nceputul celui de-al patrulea bloc vor fi ultimele 45 de litere ale celui
de-al treilea bloc.
Aadar, pentru rezolvarea problemei, mai nti vom mpri textul iniial n grupuri
de 32768 de litere. Apoi vom realiza copierea grupurilor de 15, 30 i 45 de litere dintr-
un bloc n altul i vom construi cele patru iruri sortate, folosind algoritmul radixsort.
n continuare, pentru fiecare cuvnt din dicionar, vom determina prima i ultima apa-
riie a sa n fiecare dintre irurile sortate (dac nu exist nici o apariie vom spune, prin
convenie, c poziia ultimei apariii este mai mic dect poziia primei apariii). Nu-
mrul de cuvinte dintre cele dou poziii va fi adugat la numrul de apariii n text ale
cuvntului din dicionar. Pe msur ce sunt determinate apariiile cuvintelor din dici-
onar, se vor scrie n fiierul de ieire numerele corespunztoare.
Analiza complexitii
Citirea textului care trebuie analizat se realizeaz linie cu linie, deci ordinul de com-
plexitate al operaiei este O(N). Deoarece dicionarul conine M cuvinte, ordinul de
complexitate al operaiei de citire a acestor cuvinte este O(M).
Construirea blocurilor se realizeaz pe parcursul citirii, ordinul de complexitate al
operaiei fiind O(N). Aceeai complexitate (O(N)) o are i operaia de transformare a
blocurilor, astfel nct ultimele 15 litere dintr-un grup s fie identice cu primele 15 din
urmtorul.
Algoritmul radixsort este liniar, deci ordinul de complexitate al operaiei de sortare
este O(N).
Pentru fiecare cuvnt din dicionar vom efectua cel mult opt cutri binare, ordinul
de complexitate al unei cutri fiind O(log N). Pentru cele 8 cutri vom avea ordinul
de complexitate 8 O(log N) = O(log N). Deoarece pentru fiecare dintre cele M cuvin-
te din dicionar se vor realiza cutri binare, ordinul de complexitate al operaiei de
determinare a numrului de apariii pentru toate cuvintele din dicionar este O(M)
O(log N) = O(M log N).
Generarea datelor de ieire implic scrierea a M numere, deci ordinul de complexi-
tate al operaiei este O(M).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei probleme
este O(N) + O(M) + O(N) + O(N) + O(N) + O(M log N) + O(M) = O(M log N + N).
62 Soluiile problemelor propuse la Olimpiadele de Informatic
1.4.16. Suma divizorilor
Numrul A poate fi scris ca produs de factori primi sub forma:
n
p
n
p p
d d d A = K
2 1
2 1
,
unde d
1
, ..., d
n
sunt divizorii primi ai lui A, iar p
1
, ..., p
n
sunt puterile la care apar ace-
tia n descompunerea lui A n factori primi.
Ca urmare, numrul A
B
poate fi scris sub forma:
B p
n
B p B p B
n
d d d A
= K
2 1
2 1
.
Aadar, divizorii numrului A
B
au forma
=
n
i
q
i
i
d
1
, unde q
i
variaz ntre 0 i p
i
B.
Suma acestor divizori poate fi scris sub forma:
=
= =
n i
B p q
n
i
q
i
i i
i
d
, , 1
, , 0 1
K
K
.
Aceast sum de produse poate fi scris sub forma unui produs de sume astfel:
=
n
i
B p
j
j
i
i
d
1 0
.
Aadar, suma divizorilor unui numr de forma A
B
este dat de un produs de sume.
Aceste sume au forma 1 + q + q
2
+ q
3
+ ... + q
m
, deci sunt sume ale unei progresii ge-
ometrice de raie q. Este cunoscut faptul c valoarea unei astfel de sume, pentru q > 1
este
1
1
1
+
q
q
m
, iar pentru q = 1 este m + 1.
Datorit faptului c se cere determinarea restului mpririi la 9901 a sumei divizo-
rilor, toate operaiile efectuate vor fi modulo 9901.
Vor trebui folosite relaiile:
(a + b) mod n = ((a mod n) + (b mod n)) mod n i
(a b) mod n = ((a mod n) (b mod n)) mod n.
De asemenea, datorit faptului c numrul 9901 este prim, pentru orice numr
nenul a va exista un numr a
-1
(numit invers) astfel nct (a a
-1
mod 9901 = 1). Aa-
dar, pentru a efectua o mprire cu un anumit numr vom realiza, de fapt, o nmulire
cu inversul acestuia.
Pentru a rezolva problema vom ncepe cu descompunerea numrului A n factori
primi i identificarea puterilor la care apar acetia n descompunere. Vom nmuli
aceste puteri cu B i apoi vom calcula sumele progresiilor corespunztoare.
Pentru calculul sumei unei progresii avem nevoie de efectuarea unei ridicri la pu-
tere (evident, modulo 9901). O modalitate rapid de calcul se bazeaz pe urmtoarea
formul recursiv:
ONI 2002 63
=
impar 0 pentru
par 0 pentru
0 pentru 1
] 2 / [ ] 2 / [
] 2 / [ ] 2 / [
n a a a
n a a
n
n n
n n
O modalitate de determinare a inversului unui numr a (modulo 9901) este conside-
rarea numerelor de forma 9901 k + 1 i alegerea primului numr b de aceast form
al crui rest la mprirea cu a este 1. Inversul va fi dat de valoarea b / a. Datorit fap-
tului c 9901 este prim va exista ntotdeauna un astfel de numr i se poate demonstra
c valoarea k corespunztoare este mai mic dect 9901.
O alt observaie necesar este faptul c scderea valorii 1 (necesar pentru calcu-
larea sumei progresiilor) este echivalent cu adunarea valorii 9900 (modulo 9901).
Pe parcursul determinrii sumei progresiilor, acestea vor fi nmulite, modulo 9901.
n final, rezultatul va fi scris n fiierul de ieire.
Analiza complexitii
Datele de intrare constau doar n dou numere, deci operaia de citire a acestora se rea-
lizeaz n timp constant.
Pentru determinarea divizorilor primi i a puterilor la care apar acetia n descom-
punerea numrului A vom lua n considerare numrul 2 i numerele impare cuprinse
ntre 3 i cel mult A , aadar ordinul de complexitate al acestei operaii este O( A ).
Numrul sumelor calculate este dat de numrul divizorilor primi ai numrului A.
Folosind aproximarea lui Stirling, se poate deduce c exist aproximativ ln A numere
prime cuprinse ntre 2 i A. Aadar, vom calcula O(log A) sume. Calculul unei sume
implic o ridicare la putere. Folosind algoritmul recursiv prezentat anterior, o ridicare
la puterea n are ordinul de complexitate O(log n). Puterea la care poate aprea un fac-
tor prim n descompunerea numrului A este cel mult log
2
A; n descompunerea lui A
B
puterea poate fi cel mult B log
2
A. Ca urmare, o ridicare la putere va avea ordinul de
complexitate O(log (B log A)). Celelalte operaii necesare pentru calculul sumelor se
realizeaz n timp constant (considerm c determinarea inversului are ordinul de
complexitate O(1) deoarece operaia necesit cel mult 9901 pai; exist i posibilitatea
construirii i utilizrii unui tablou de constante a, unde a
i
s conin inversul numru-
lui i modulo 9901), deci ordinul de complexitate al determinrii sumei tuturor divizo-
rilor este O(log A) O(log (B log A)) = O(log A log (B log A)).
n fiierul de ieire trebuie scris un singur numr, deci ordinul de complexitate al
operaiei de scriere a datelor de ieire este O(1).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(1) + O( A ) + O(log A log (B log A)) + O(1) = O( A + log A log(B
log A)).
64 Soluiile problemelor propuse la Olimpiadele de Informatic
1.4.17. Sistem
Problema poate fi enunat n termeni ai teoriei grafurilor astfel: S se determine nu-
mrul grafurilor neorientate distincte n care fiecare nod are gradul 2.
Este uor de determinat numrul grafurilor conexe cu proprietatea cerut; practic,
orice permutare (p
1
, p
2
, ..., p
N
) a mulimii poate duce la obinerea unei soluii. Dac
unim printr-o muchie vrfurile p
i
i p
i+1
(i = 1, , N 1) i vrfurile p
1
i p
N
,, obinem
un graf (hamiltonian) n care toate vrfurile au gradul 2. Lund n considerare toate
cele N! permutri obinem N! grafuri care respect proprietatea cerut. Totui, nu toate
aceste grafuri sunt distincte; dac alegem o anumit permutare, atunci toate celelalte
permutri circulare ale acesteia duc la obinerea aceluiai graf. De exemplu, permutri-
le (1, 2, ..., N) i (N, 1, ..., N 1) corespund aceluiai graf. Exist N permutri circulare
ale unei permutri date, deci numrul total al grafurilor distincte se reduce de N ori,
devenind (N 1)!. n plus, dac parcurgem n ordine invers o anumit permutare,
obinem acelai graf, deoarece grafurile sunt neorientate. De exemplu, permutrile (1,
2, ..., N) i (1, N, ..., 2) duc la obinerea aceluiai graf. Fiecare permutare poate fi par-
curs n sens invers ntr-un singur mod, deci numrul total al grafurilor distincte se
reduce de 2 ori. n concluzie, numrul grafurilor conexe cu proprietatea cerut este (N
1)! / 2. Aceast valoare este valabil pentru grafuri care conin cel puin trei noduri;
nu exist grafuri cu proprietatea cerut care s conin unul sau dou noduri.
Urmeaz s determinm numrul total al grafurilor (conexe i neconexe) care au
proprietatea cerut. Vom nota cu Nr
k
numrul grafurilor care respect proprietatea ce-
rut i conin k noduri. Vom avea Nr
1
= Nr
2
= 0 deoarece nu exist nici un astfel de
graf care s conin unul sau dou noduri. Prin convenie vom considera Nr
0
= 1 (se
poate considera c graful vid respect proprietatea cerut, deoarece am putea spune c
"toate cele 0 noduri au gradul 2", dei aceast afirmaie este, practic, lipsit de sens;
totui aceast convenie se va dovedi util pentru simplificarea calculelor).
Vom considera, pe rnd, c nodul 1 face parte din componente conexe cu 3, 4, ..., N
noduri. Vom determina numrul de grafuri n care acest nod face parte din componen-
te conexe cu k elemente (k este cuprins ntre 3 i N) i apoi vom aduna aceste valori.
Dac nodul 1 face parte dintr-o component conex cu k elemente, atunci exist
1
1
k
N
C
posibiliti de a alege celelalte k 1 noduri care fac parte din aceeai componen-
t conex. Folosind rezultatul demonstrat anterior, deducem c numrul componente-
lor conexe cu k elemente care respect proprietatea cerut este (k 1)! / 2. Indiferent
care sunt cele k noduri care formeaz componenta conex, celelalte N k noduri pot
forma Nr
N-k
grafuri cu proprietatea cerut. n concluzie, dac nodul 1 face parte dintr-o
component conex cu k elemente, avem
( )
2
! 1
1
1
k
C Nr
k
N k N
grafuri distincte cu
proprietatea cerut.
Se observ utilitatea conveniei Nr
0
= 1 deoarece, pentru componenta conex for-
mat din toate cele N noduri ale grafului, obinem:
ONI 2002 65
( ) ( ) ( )
2
! 1
2
! 1
1 1
2
! 1
1
1
N N N
C Nr
N
N N N
,adic exact numrul grafurilor conexe
cu proprietatea cerut. Cazul k = N ar fi putut fi tratat ca fiind unul particular, dar folo-
sirea conveniei duce la simplificarea formulelor de calcul.
Numrul total al grafurilor este obinut prin nsumarea acestor valori pentru k = 3,
, N, deci vom avea
=
N
k
k
N k N N
k
C Nr Nr
3
1
1
2
)! 1 (
grafuri cu proprietatea cerut.
Chiar i pentru valori mici ale lui N, acest numr nu va putea fi reprezentat folosind
tipuri standard de date, deci vor trebui simulate operaii aritmetice cu numere mari.
Folosind un artificiu de calcul, nu va trebui s implementm dect adunarea a dou
numere mari i nmulirea dintre un numr mare i un numr mai mic dect N.
Vom avea nevoie de adunarea numerelor mari pentru calcularea sumei care duce la
obinerea valorilor Nr
k
. Valorile nsumate sunt obinute prin nmulirea unui numr
mare (Nr
N-k
cu mai multe numere mai mici dect 100). Aceste numere sunt obinute
folosind urmtorul artificiu:
.
2
) 1 ( ) 2 ( ) 1 (
)! ( 2
)! 1 (
2
)! 1 (
)! ( )! 1 (
)! 1 (
2
)! 1 (
1
1
+ +
=
=
N k N k N
k N
N k
k N k
N k
C
k
N
K
Aadar, irul numerelor cu care se vor realiza nmuliri este N k + 1, N k + 2, N
- 1. Deoarece k este cel puin 3, acest ir are cel puin dou elemente; elementele iru-
lui sunt numere consecutive, deci unul dintre primele dou este par. Acest numr par
va fi mprit cu 2 i se va obine un ir de elemente care vor fi nmulite, pe rnd, cu
un numr mare.
Pentru determinarea valorii Nr
N
este necesar calcularea tuturor valorilor Nr
k
(k <
N): acestea vor fi pstrate ntr-un ir de numere mari, iar n final valoarea Nr
N
va fi
scris n fiierul de ieire.
Analiza complexitii
Fiecare operaie aritmetic se efectueaz n timp constant, deoarece numrul cifrelor
unui numr (dac se folosete baza 10000) este mai mic dect 100.
Citirea datelor de intrare este realizat n timp constant pentru c se citete un sin-
gur numr.
Pentru calcularea unei valori Nr
K
avem nevoie de nsumarea a k 3 termeni. Valo-
rile Nr
i
necesare sunt cunoscute de la paii anteriori; pentru determinarea termenilor
care trebuie nsumai avem nevoie de i 1 nmuliri. Aadar, n total vom avea (k 4)
+ (k 5) + ... + 1 = (k 4)(k 3)/2 nmuliri. n concluzie, ordinul de complexitate al
operaiei de determinare a numrului Nr
k
este O(k
2
). Vom determina N astfel de nume-
re, ordinul de complexitate al ntregii operaii fiind O(N
3
), deoarece avem k = O(N).
66 Soluiile problemelor propuse la Olimpiadele de Informatic
Datele de ieire constau ntr-un singur numr mare, deci operaia de scriere a aces-
tora se realizeaz n timp constant.
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(1) + O(N
3
) + O(1) = O(N
3
).
1.4.18. Comitat
O posibilitate de rezolvare a acestei probleme este folosirea metodei programrii di-
namice. Vom ncerca s determinm un tablou tridimensional A, unde A
ijk
va indica
lungimea minim a unui traseu care pornete din Mordor (turnul 0), ultimele dou tur-
nuri de pe acest traseu sunt j i k i traseul conine n total i turnuri.
Se observ c lungimile traseelor care conin i turnuri pot fi determinate cu ajutorul
lungimilor traseelor care conine i 1 turnuri. Astfel, vom lua n considerare toate tra-
seele pe care se afl i 1 turnuri, i ultimul turn al traseului este j i l vom alege pe
cel mai scurt dintre acestea. La lungimile acestor trasee vom aduga distana dintre
turnurile j i k. Datorit faptului c un clre se poate deplasa doar paralel cu axele de
coordonate, distana dintre dou turnuri i i j va fi dat de |x
i
x
j
| + |y
i
y
j
|. Fie p, pe-
nultimul turn de pe traseul care se termin n turnul j; evident, unghiul determinat de
turnurile p, i i j nu trebuie s anuleze convexitatea traseului. Pentru a putea reconstitui
traseul vom pstra, pentru fiecare triplet (i, j, k) numrul de ordine p al turnului care se
afl pe traseu naintea turnurilor j i k.
n final, vom obine toate elementele tabloului tridimensional A. Evident, traseul
trebuie s fie un poligon nchis, deci ultimul turn trebuie s fie 0 (Mordor). Aadar,
vom studia valorile A
ij0
; vom determina cea mai mare valoare i pentru care exist o
valoare j, astfel nct valoarea A
ij0
este cel mult egal cu lungimea maxim a traseului.
Dup identificarea valorilor i i j, vom putea determina turnurile de pe traseu cu
ajutorul predecesorilor pstrai pentru fiecare triplet (i, j, k).
Pentru a mri viteza de execuie a programului vom determina, pentru fiecare tri-
plet (i, j, k), dac cele trei turnuri corespunztoare se pot afla pe poziii consecutive n
traseu (se respect condiia de convexitate) i vom folosi aceste informaii pe parcurs
n loc s verificm convexitatea de fiecare dat.
Iniial putem determina toate traseele pe care se afl dou turnuri (Mordor i orica-
re dintre celelalte). n continuare vom aplica algoritmul pentru a determina lungimile
traseului pe care se afl 3 turnuri, 4 turnuri etc.
Analiza complexitii
Datele de intrare constau n numrul turnurilor, coordonatele acestora i lungimea ma-
xim a traseului, deci ordinul de complexitate al operaiei de citire este O(n).
Va trebui s verificm pentru fiecare triplet (i, j, k) dac se respect condiia de
convexitate, operaie care are ordinul de complexitate O(n
3
), deoarece exist (n + 1)
3
astfel de triplete (i, j i k variaz ntre 0 i n).
ONI 2002 67
Pentru a determina o valoare A
ijk
, vor trebui luai n considerare toi predecesorii
posibili, deci ordinul de complexitate al acestei operaii este O(n). Deoarece tabloul
este tridimensional sunt realizate O(n
3
) astfel de operaii, deci ordinul de complexitate
al operaiei de determinare a tabloului A (i a tabloului care conine predecesorii) este
O(n) O(n
3
) = O(n
4
).
Identificarea valorii A
ij0
care indic lungimea traseului care conine cele mai multe
turnuri se realizeaz n timp ptratic deoarece, n cel mai defavorabil caz, sunt luate n
considerare toate perechile (i, j).
Refacerea traseului (i scrierea turnurilor de pe traseu n fiierul de ieire) pe baza
tabloului predecesorilor se realizeaz n timp liniar, deoarece vor exista cel mult n tur-
nuri pe acest traseu.
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(n) + O(n
3
) + O(n
4
) + O(n
2
) + O(n) = O(n
4
).