You are on page 1of 195

CHUYN 1

NH HNG TRANG B KIN THC C S TIN HC


Trong trng PTTH mn Tin hc c trin khi ging dy cho mi hc sinh.
Vi c th ca trng chuyn, nu xt ta trn cc gc :
Trnh tip thu,
Yu cu ca chuyn ngnh i vi
Tin hc,
hc sinh c th c chia thnh ba lp i
tng khc nhau:
Hc sinh cc lp khng chuyn tin,
Hc sinh lp chuyn tin nm ngoi
danh sch d tuyn hoc i tuyn,
Hc sinh i d tuyn hoc i
tuyn.
Mi loi i tng c yu cu ring v kin
thc cn trang b v ko theo l ni dung v
phng php truyn t.
Vi hc sinh chuyn tin (khng thuc din
bi dng i tuyn) v hc sinh khng
chuyn tin trong phm nh trng ph
thng ch cn dng li vic trang b kin
thc c s, nhng kin thc m trong mt
Hnh 1
chng mc no sau khi tt nghip ph
thng hc sinh cn nh c v c tc dng
h tr trong vic hc tp tip theo cng nh trong cng vic sau ny. Mi i
tng cn c mt khi lng kin thc c s ring.
1.1. KHI KHNG CHUYN
Khng chuyn tin l nhm hc sinh ng o nht. i vi hc sinh khng
chuyn tin, k nng lp trnh khng phi l iu quan trng nht. Hc sinh
thuc nhm ny ch cn nm c:
Tin hc cung cp dch v c hiu qu trong mi lnh vc ca cuc sng
hng ngy,
Cc dch v c cung cp trn nguyn l v c s no?
Ti sao cc dch v mang li hiu qu lao ng cao cho con ngi?
Mi trng tin hc ha cao tc ng n suy ngh v hnh ng ca
chng ta nh th no?
1

Khi trnh by mi vn , khng nn i qu su vo chi tit k thut, khng bt


hc sinh phi nh cc thao tc c th cho tng loi cng vic. iu ch cht l
nguyn nhn ti sao nng sut lao ng li tng ln, ta c cung cp nhng
dch v no, nu cha bit hoc qun th tm kim cch tc ng ln h thng
nh th no t c mc ch c th ca mnh.
V d, vi chng Son tho vn bn, nhng iu m hc sinh phi nh sau khi
hc l:
Cc h thng son tho vn bn cho php ta tch ring 2 phn c lp:
ni dung vn bn v hnh thc trnh by vn bn,
C nhiu kh nng tc ng vo hnh thc trnh by: t l cho trang vn
bn, kiu ch, khong cch dng, . . .
Cc h thng son tho vn bn khc nhau kh nng cung cp cc dch
v trnh by, kh nng lm vic vi cc dng ni dung (bng, hnh nh,
biu , cng thc, v.v. . .),
H thng cng hin i th cc kh nng ny cng nhiu v cng d s
dng.
Trong s cc tnh nng trn, tnh nng quan trng nht v mang li thay i v
cht lng l vic tch ring ni dung vi hnh thc. Chnh iu ny lm cho
vic son tho vn bn trn my tnh khc hn vic vit tay trn giy hoc nh
my ch.
i su hn na, c th trnh by v c ch hot ng ca h son tho. Vi mi
vn bn h thng to mt c s d liu qun l. C s d liu cng phong
ph th kh nng ca h thng cng ln.
Trm nghe khng bng mt thy, cn phi nu rt nhiu v d minh ha hc
sinh thy c cc kh nng l c thc.
Gi thc hnh l lc hc sinh tri nghim li nhng iu nghe, thy, hiu v
nh. y cng l lc rn luyn k nng tm kim v kch hot cc chc nng c
th trong trng hp c th.
Vic so snh cc h thng son tho vn bn khc nhau s cung cp cho hc
sinh kin thc v l gic tin ha, pht trin ca h thng.

Ngi dng
ch ng

H thng h tr
H SON
THO

HNH THC

NI DUNG

Cc khun dng b tr

Vn bn
Hnh nh

Hnh ng
Mu

Bng

m thanh
Kch thc

Hnh 2
T y ta c th cung cp cho hc sinh kh nng t on nhn v d bo kh
nng pht trin ca cc loi h thng son tho ni chung nh son tho hnh v
(photoshop, Microsoft Visio, . . .), son tho nh v videoclip (Movie Maker,
PowerPoint, . . .), cc h son tho chuyn dng bin tp ti hiu chuyn
ngnh (ton, l, ha, . . .).
Nh vy, ch cn thng qua h thng son tho vn bn ta cung cp cho hc
sinh kin thc v mi loi h thng son tho cho mi loi i tng!
Ton b chng trnh lp 12 l xem xt li mt cch tng qut ha phn ln cc
kin thc c.
Nh vy, kin thc c s khng nhiu. Vi i tng hc sinh ph thng ta,
phi i t c th n tng qut ha, phi c cc v d c th, nhng phi ht sc
trnh:
Ch dn qu nhiu cc thao tc c th,
Ch dn mt cch ri rc, khng phn loi v h thng ha,
Yu cu hc sinh nh, thuc qu nhiu cc chi tit c th ca h thng c
th.

Tt c cc loi h thng u lun lun hot ng ca theo s :

Np
d liu

CSDL

H Qun tr CSDL

Kt qu
Truy vn

Hnh 3

Vic dy Exel, Access cng hon ton tng t nh dy h son tho vn bn.
Tuy nhin mi h thng cn nhn mnh cho hc sinh thy r nhng mt mnh
v yu ca h thng ang xt, cho hc sinh nh c kh nng v phm vi
ng dng ca loi h thng ny. l nhng iu ta cn v ch cn t c i
vi i b phn hc sinh ph thng. Nhng iu ny khng lc hu trong sut
phn cuc i tip theo ca hc sinh.
K nng lp trnh khng phi l trng tm i vi cc hc sinh ca nhm ny.
Tuyt i b phn hc sinh thuc nhm ny s khng c nhu cu t lp trnh
gii quyt cc vn ca mnh trong tng lai.

1.2. KHI CHUYN TIN


c trng c bn ca lp i tng ny:
Nhiu hc sinh bit v s dng kh thng xuyn cc dch v tin hc,
C kin thc c s ton tt,
C kh nng v nhu cu lp trnh.
Kin thc cn trang b bao gm 2 phn: cc Kin thc chung v Tin hc v C
s lp trnh. Kin thc chung v Tin hc vn rt cn thit vi loi i tng ny

v n s tc ng rt ln ti phn C s lp trnh, lm cho vic lp trnh d dy


hn v dy c su hn. Cc im mu cht trong phn ny vn l:
Cc dch v c cung cp trn nguyn l v c s no?
Ti sao cc dch v mang li hiu qu lao ng cao cho con ngi?
Mi trng tin hc ha cao tc ng n suy ngh v hnh ng ca
chng ta nh th no?
Vi i tng ny cn gii thch su hn v c ch trong hin thc ha cc
nguyn l v c s . Hc sinh khng cn phi nh, phi thuc nhng kin
thc ny nhng phi bit ti sao my tnh p ng c yu cu ca ta v p
ng bng cch no.
V d, khi ta nhy chut vo mt biu tng no trn mn hnh nn
(Desktop) ti sao h thng bo i tng c chn hoc h thng kch hot
cng vic tng ng vi biu tng?
Nn gii thch cho hc sinh v c ch hot ng ca h thng: mi biu tng c
biu din di dng mt bc tranh hnh vung. H thng c c s d liu qun l v
tr cc hnh vung ny trn mn hnh nn v cng vic (chng trnh) tng ng vi
hnh ny. Khi ta nhy chut, da vo v tr ca chut h thng s xc nh c biu
tng m ta chn (hoc khng c biu tng no c). Ph thuc vo cch nhy chut
h thng s bit ta mun chn hay mun kch hot cng vic c chn v c hnh
ng tng ng: i mu nn ca biu tng hoc kch hot cu ln gi chng trnh
tng ng. Nu ta ko biu tng sang v tr mi, h thng s cp nht li c s d
liu qun l Desktop.

Tt c mi gii thch u hng suy ngh ca hc sinh ti hai :


Mi cng vic u c c s d liu tng ng (c th rt n gin hoc
phc tp),
Vic lp trnh quyt nh tt c!
Nu hc sinh, c th ngc nhin, nhng khng cn thy b him hay ng ngng
trc mt dch v no ca h thng th c ngha chng ta thnh cng
trong vic chun b bc sang phn lp trnh.
iu ny rt quan trng v:
Hc sinh thy c l gic ca vn ,
Thy c vai tr, v tr ca khu lp trnh,
Thy c vai tr, v tr ca d liu v t chc d liu.
Vic chuyn sang dy lp trnh s bt kh khan, nhm chn v ri rc. i vi
hc sinh trong i tuyn tng lai iu ny l ht sc cn thit v hc sinh thy
5

c tm quan trng ca d liu, t ngang hng vic thit k, t chc d liu


vi gii thut. Thng thng, hc sinh ch quan tm n gii thut trn quan
im ton hc thun ty. iu ny l cn thit, nhng ch l mt khu nh trong
qu trnh gii bi ton.
Chnh v vy, cc ngn ng lp trnh pht trin hin nay cung cp rt nhiu cng
c h tr t chc d liu v cc cng c thao tc chun vi cc d liu .
1.3. HC SINH NNG KHIU
Kt qu hot ng bi dng hc sinh nng khiu l mt trong s cc ch tiu
quan trng nh gi hiu qu ca mt trng chuyn.
Nu xem xt trn quan im cng ngh, qu trnh tc ng ln hc sinh nng
khiu c 3 khu:
Pht hin,
o to,
Bi dng.
Pht hin: Tm ra cc hc sinh c tim nng tr thnh hc sinh gii Tin hc.
o to: Xt ring v mt chuyn mn l trang b cc kin thc c s cn thit
vi mt hc sinh nng khiu.
Bi dng: Trang b thm cc kin thc chuyn su, rn luyn v nng cao k
nng t duy linh hot, sng to.
Trong phn ny ta ch xem xt cc vn lin quan ti khu o to v cng
ch xem xt gc trang b cc kin thc c s. y l cng vic kh nhm
chn , bun t. Khi lng kin thc thuc din c s kh ln, t thay i trong
mt khong thi gian di, s v trnh t truyn t tng i n nh, mt
bng kin thc ca hc sinh cha ng u. Vi thc t hin nay ta c khng
qu 4 thng cho vic trang b kin thc c s v phi lm vic ny an xen vi
vic bi dng, nng cao k nng ng dng sng to i vi cc kin thc c s
trang b trc . Nh vy, cn phi xc nh r, nhng kin thc g thuc
loi c s, tc l nhng th phi trang b n tn rng cho mi hc sinh (trong
i tuyn hoc d tuyn). Vi mi m hnh ton hc cho mt gii thut c s
cn chun b nhiu bi ton tng ng vi ni dung pht biu khc nhau
trnh s nhm chn xut hin trong hc sinh, c bit l nhng i tng
qua khu o to ca nm trc.
6

1.3.1 NH HNG
Cc cuc thi Olympic Tin hc c trin khai rng ri gn ht cc nc trn
th gii hng ti cc mc ch:
y mnh phong tro dy v hc Tin hc nhm p ng cc yu cu ca
cuc sng ang c tin hc ha su rng v vi tc cao trong mi
lnh vc,
Pht hin cc nhn t ni bt o to v khai thc ngun nhn lc nh
cao, c tri thc v c tay ngh theo kp s pht trin ca l thuyt v yu
cu ca thc t.
Vic o to, bi dng hc sinh gii Tin hc chu tc ng rt nhiu ca hai
yu t:
S pht trin ca l thuyt,
S pht trin ca cng c Tin hc.
C th thy r xu hng dy v hc Tin hc cho n nay chia thnh ba giai
on:
Giai on I: nhng nm cui ca th k XX,
Giai on II: Thp k u tin ca th k XXI,
Giai on III: Thp k th 2 ca th k XXI, tc l nhng nm hin ti.
giai on I, ngnh Tin hc mi tch ra v pht trin thnh mt ngnh khoa
hc c lp. Ngi ta tp trung mi sc lc vo vic xy dng nn mng cho
mt ngnh khoa hc mi, c gng tm cch gii quyt c cc lp bi ton
truyn thng xut hin khi tip cn bi ton trn quan im ton hc. Vic
nm vng cc kin thc ton hc l iu kin ch yu gii quyt cc bi ton
tin hc. Ngoi ra cn phi lu ti cc rng buc t nhin v b nh nh v tc
tng i thp ca my tnh lc by gi. l s tip tc ca t duy nhng
nm 70 80 ca th k 20.
V d, mt vi trong nhng bi kh ca nhng nm 90:
Bi 6. IOI 1990 Belarus
Cho cc s nguyn a v n (n < 100). Gi thit ta c mt ngn ng lp trnh ch c th
thc hin php gn v php nhn. Hy khi to chng trnh tnh b = an vi s php
nhn cn thc hin l t nht.
V d, vi n = 13, chng trnh c dng nh sau (trong cp ngoc {} l thng tin ch
thch):
X1 := a;

{= a}
7

X2 := X1*X1;
X3 := X2*X2;
X4 := X3*X1;
X5 := X3*X3;
X6 := X5*X4;
B := X6;

{= a2}
{= a4}
{= a5}
{= a8}
{= a13}

Phn tch: Xt n dng biu din nh phn, n = 1310 = 11012. Gi m l s ch s


c ngha trong dng biu din nh phn ca n, k l s lng bt bng 1, s php
nhn phi thc hin l (m-1)+(k-1).
C th d dng xc nh s lng bin trung gian cn s dng v cch tnh gi
tr cc bin trung gian .
Nhn xt: Kch thc bi ton rt nh, ph hp b x l 8 bt ph bin thi k
(PC XT).
Vo na sau ca nhng nm 90 kh ca bi ton bt u thay i:
Bi 6. IOI 1996 Hungary HNH VUNG K DIU
Tip theo s thnh cng ca khi lp phng ni ting ng Rubik xut phng n
phng ca tr chi ny. l mt tm nha c ghp t 8 hnh vung thnh 2 hng,
mi hnh vung c mt mu, nh s t 1 n 8 theo chiu kim ng h, bt u t hnh
vung trn tri (Xem phn bn tri ca hnh 1). Cu hnh ny c gi l cu hnh ban
u.
C 3 php bin i c s vi tm
nay:
A i ch 2 hng trn v
di,
B Chuyn dch vng trn
cc ct sang phi mt v tr,
C - Chuyn dch vng trn 4
hnh vung gia theo
chiu kim ng h.
Tt c cc cu hnh khc nhau ca
tm nha u c th nhn c t
cu hnh ban u bng cch p dng
cc php bin i c s.

4
1
5
1

Hnh 4

B
A

4
1
5

5
1
4
1
3

1
1

4
1
5
1

Hy vit chng trnh xc nh xc nh dy bin i c s a tm nha t cu hnh


ban u v cu hnh ch cho trc (Yu cu A). Bn s nhn thm 2 im thng nu
s php bin i tm c khng vt qu 300 (Yu cu B).
D liu: Vo t file vn bn INPUT.TXT gm mt dng cha 8 s nguyn xc nh cu
hnh ch.
8

Kt qu: a ra file vn bn OUTPUT.TXT, dng u tin cha s nguyn m s php


bin i ca dy tm c, mi dng trong m dng sau cha mt k t xc nh tn php
bin i. Cc php bin i a ra theo trnh t thc hin.
V d:
INPUT.TXT

OUTPUT.TXT

2 6 8 4 5 7 3 1

7
B
C
A
B
C
C
B

Phn tch: Gi R = (r1, r2, r3, r4, r5, r6, r7, r8) l vc t m t trng thi ca Rubic
phng. R l mt hon v ca cc s t nhin t 1 n 8. Bng vic p dng cc
php bin i cho ta c th lm cho R nhn gi tr l hon v bt k. Nh
vy, s trng thi khc nhau ca Rubic l 8! = 40320.
Ngy nay, vi cc cng c phn cng v phn mm hin i, y l mt bi
ton loang n gin.
Nhng thi k cui nhng nm 90, cc cng c ch cho php s dng b nh
64KB tnh + 64KB ng, tc my tnh ph bin 33MHz y l mt bi ton
kh. Cn phi kho st, tm cc php bin i macro c s, m t li gii qua
cc php macro ny, khai trin macro v rt gn, tuy khng nhn c dy php
bin i ngn nht, nhng dy bin i cng ngn hn nhiu so vi gii hn
thng 300.
Chng ta t c nhng kt qu rc r trong thi k ny v i ng gio
vin tin hc phn ln xut thn t gio vin chuyn ngnh ton. Hc sinh ca
chng ta c trang b kin thc c s v ton kh tt.
Giai on II t nhng nm 2001 n 2007, s tin b v cng ngh v s ph
cp ca cc h thng phn mm tin tin a n nhng s chuyn dch
trong vic o to chuyn gia trong lnh vc tin hc. iu ny dn n nhng
thay i trong cng tc pht hin, o to v bi dng hc sinh gii tin hc.
Do ni dung thi Tin hc Quc t cng c nhiu thay i. Cc kin thc gii
thut c coi l nh cao trc y by gi tr thnh bng cu chng
m ai cng phi bit v phi thuc. Nhng gii thut phc tp, t dng th khng
9

nht thit phi thuc, nhng bt c ai v lc no cng c th tra cu, tm kim


chng trn Internet khi cn thit. S thng minh v tnh sng to by gi phi
th hin khng phi ch bn thuc nhiu hay t cc gii thut khc nhau, cng
khng phi bn ci t chng nhanh ti mc no. Th thch by gi l ch
bn c th tm ra nhng gii php hu hiu gii quyt mt cch c hiu qu cc
bi ton cc vn c m hnh ton hc n gin nhng c kch thc ln hay
khng?
t c mc ch ngi lp trnh phi bit tn dng ti a kh nng m
phn cng v h iu hnh cung cp. Cc h thng lp trnh mi nh Free
Pascal, Dev C++ (nhng phin bn u tin) to iu kin ngi dng
khai thc c ti a kh nng ca phn cng.
giai on ny, gii mt bi ton olympic thc cht ta phi xy dng mt c
s d liu (CSDL) nh, t chc qun l v truy vn ti CSDL tm ra li
gii cn thit.

Khai khong d liu


D liu vo

CSDL

Truy vn

Np d liu

Kt
qu

Ghi nhn d liu


Hnh 5
c im c bn ca s trn l qu trnh gii bi ton c chia thnh 2 giai
on phn bit:
Ghi nhn d liu,
Khai khong d liu (Data Mining).
Vic ghi nhn d liu khc vi vic nhp thun ty l thng thng d liu
c lu li sau khi qua mt s php bin i n gin. Trong rt nhiu

10

trng hp d liu c n v lu tr theo cm, bao gm gi tr v cc thuc


tnh. Cm d liu ph bin hn c l gi tr v th t xut hin.
Phn khai khong d liu i hi s linh hot v sng to cao ca ngi lm.
m bo hiu qu cao trong khai khong v truy vn nhiu lp bi ton i
hi phi s dng cc cu trc d liu nh cc loi cy nh phn, cy qun l
interval, cy tin t, v.v. . ., ngi lp trnh phi bit t chc v qun l stack,
heap, hng i, hng i hai u, hng i u tin , . . .
Tt c nhng iu ny lm thay i mt cch ng k n ni dung v
phng php trang b kin thc c s cho hc sinh.
ng tic l ti tn nm 2007 khi th gii i ht chng ng quan trng ny
th chng ta mi c php chnh thc t chn ln mnh t in y du
chn ca nhng ngi tin phong, i vo con ng vn by gi tr thnh k
nim p ca nhng ngi i trc.
giai on III, tc l nhng nm gn y, trong danh mc yu cu i vi
ngi lp trnh c thm cc i hi mi:
Khng nhng bn phi ng vng trn nn tng ca phn cng v h
thng m cn phi bit khai thc ti a kh nng ca cng c lp trnh.
C th, bn phi khai thc c trit mt mnh ca cc th vin ca
h thng lp trnh c trong tay,
C kin thc c s ton hc vng v su,
Trin khai ng dng gii thut kp: kt hp nhiu gii thut c s n
trong vic t chc d liu,
Nng cao tnh hon thin ca chng trnh: chng trnh phi cho kt qu
ng v x l c hiu qu vi tng lp d liu (ca bi ton).
on nhn hng gii v tm c gii thut c hiu qu hc sinh cn c
trang b:
C s ton hc su v rng hn,
C k nng trin khai mt gii thut vi vic ng dng cc loi cu trc
d liu khc nhau v phm vi hiu qu ca cc cch trin khai ,
K thut lm vic vi mt s lp d liu c th nh hon v cc s t 1
n n, tp hu hn cc s nguyn khc nhau tng i mt . . .
Trong nhiu trng hp chng trnh gii bi ton khng n thun l mt h
qun tr CSDL m l mt h qun l c s tri thc. Nh vy i tng cn
chun b khng n thun l mt CSDL m l mt CSDL cng vi mt c s tri
11

thc. Nh vy chng trnh gii trn thc t l mt h chuyn gia nh. Phn ln
cc bi ton loi ny thuc lp bi ton giao tip ngi my (interactive task).
Trn th gii, loi bi ton ny c a vo ngy cng nhiu trong cc k thi
quc t, quc gia v khu vc. bt u xut hin cc bi ton khng thuc
loi giao tip ngi my nhng vn i hi chin lc tm kim ng.
Hc sinh khng nhng phi bit cc gii thut khc nhau cho tng lp bi ton
m ngoi vic nh gi phc tp cn phi hiu su v cc thuc tnh lin quan
ti gii thut hoc cc tnh cht ton hc ca nhng i lng s dng trong gii
thut. V d, v s Fibonacci, ngoi cch tnh theo nh ngha Fn = Fn-1 + Fn-2 (n
2) hc sinh cn bit cc cch tnh khc, bit c tc tng ca cc s trong
dy l xp x 1.618.
Qu thi gian ging dy khng nhiu, v vy cn cn nhc k khi la chn ni
dung, phng php v trnh t truyn t kin thc c s cho hc sinh. y l
khi lng kin thc cn trang b trong qu trnh ging dy chung v ch yu l
trong giai on lm vic vi i d tuyn. Khi lng kin thc phn ny rt
ln, nhng n nh trong khong thi gian di v quyt nh cht lng, hiu
qu ca vic bi dng i tuyn sau ny. Chnh v vy n cn phi c chun
b ht sc chu o v chi tit.
i vi i d tuyn, mi chuyn s l tng trnh by bao gm cc ni
dung:
M hnh ton hc: pht biu bi ton di dng ton hc thun ty,
C s ton hc ca gii thut,
Cc cch hin thc ha gii thut:

Hnh 6
12

Cu trc d liu,
S x l,
Chng trnh,
phc tp,
Cc loi bi ton c cng m hnh ton hc,
Mt s bi ton ng dng.
Trnh t truyn t khng quan trng, su chuyn mn trong tng mc ph
thuc vo thi lng cho php, vo kh nng tip thu ca nhm hc sinh c th.
Phn S x l l trng tm ca ton b ni dung trnh by. Ni chung, mi
s x l i hi mt cch t chc d liu ring. N ph thuc nhiu vo
cng c lp trnh, ph thuc vo cng c x l m h thng lp trnh cung cp
i vi loi d liu chn. y gii thut c trnh by li trn ngn ng
ca d liu. K nng trnh by gii thut trn ngn ng ca d liu l im yu
ca phn ln hc sinh. Vic rn luyn k nng ny cn quan trng hn lp
trnh! Nu hc sinh trnh by tt mt gii thut no trn ngn ng d liu th
thm ch khng nht thit phi lp trnh.
To thi quen v k nng trnh by gii thut trn ngn ng d liu l mt qu
trnh. to c thi quen th phi tun th nguyn tc Vn n v luyn:
thng xuyn, lin tc yu cu hc sinh tp trnh by. Bn cnh vic trnh by
gii thut vi cc bi mi cn n li cch trnh by cc bi lm. Mt trong
nhng im mu cht c th trnh by c gii thut trn ngn ng d liu
l ni c mt cch r rng, ngn gn v tuyt i chnh xc vai tr, ngha
ca cc d liu dng trong gii thut. Vic trnh by ny c thc trn ngn
ng t nhin v ton hc, v vy tuyt i trnh vic c cu lnh ca chng
trnh!
V d: Chuyn v s Catalan.
Bi ton:
Xt dy s nguyn A = (a0, a1, a2, . . ., a2n) tha mn cc iu kin:
ai 0, i = 0 2n,
|ai ai-1| = 1, i =1 2n.
Yu cu: Cho s nguyn n (0 n 50). Hy tnh s lng dy s A khc
nhau tha mn cc iu kin nu.

13

D liu: Vo t file vn bn CAT.INP gm nhiu dng, mi dng cha


mt s nguyn n.
Kt qu: a ra file vn bn CAT.OUT, mi kt qu a ra trn mt
dng di dng s nguyn.
V d:
CAT.INP

CAT.OUT

2
6
4

2
132
14

C s ton hc:
Vi n cho trc, gi s lng dy A tm c l cn. Dy s C = (c0, c1, c2, . . .)
c gi l dy s Catalan (theo tn nh ton hc B Eugne Charles Catalan).
S ci c gi l s Catalan.
S Catalan thng gp trong mt lot cc bi ton t hp khc nhau.
Nhng s u tin ca dy s Catalan l:
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, . . .
Cc cch tnh s Catalan cn:

, trong

i.

l t hp chp k ca n,

ii.

C0 = 1, Cn =
iii.

2(2n-1)
Cn-1
n+1

nk
k
k 2
S lp:
n

iv.
v.

Cn

14

p0 = 1, pi=0, i =1, 2, . . ., n
i=1n
j =1 i
pi=pi+pi-1
cn=pn
vi.

Tnh gn ng:

S tnh ton:
Mi cch tnh ph hp vi mt s loi bi ton khi lm vic vi s Catalan. Cc
cch tnh th 2 v th nm ch i hi dng cc php cng v nhn. iu ny
thch hp vi n ln v Cn tng rt nhanh theo n (cng thc 6).
Cch tnh th 5 c phc tp cao nht, nhng li cung cp y thng tin
nht v dy s catalan cng nh vic phn b cc cu hnh to ra mt s ca
dy.
Mt s bi ton t hp c kt qu l Cn:
- S lng biu thc ngoc ng c th xy dng t n cp ngoc trn ( v ),
v d, vi n = 3 ta c 5 biu thc:

((())) (()()) (())() ()(()) ()()()


Hnh 7
- S cy nh phn y khng ng cu c n+1 nt l (cy nh phn m mi
nt nu khng phi l l th c ng 2 nt con):

Hnh 8
- S ng i t im ta (0, 0) ti im ta (n, n), qua cc im nguyn
ca li vung kch thc nn, ch sang phi v ln trn, khng vt qua
ng cho ni 2 im (0, 0) v (n, n):
15

Hnh 9
- S cch chia mt a gic li n+2 nh thnh cc tam gic bng cc ng cho
khng c im chung bn trong a gic:

Hnh 10
- S cch ph ci bc hnh bc thang cao n bng n hnh ch nht, cc hnh
ch nht khng c din tch chung khc khng:

Hnh 11
- S lng cc hon v t 1 n n sp xp c bng stack (c th chng minh
c rng mt hon v A = (a1, a2, . . ., an) cc s t nhin t 1 n n c th sp
xp c bng stack khi v ch khi khng tn ti i < j < k sao cho ak < ai < aj).
Bi tp ng dng:
16

Bi 1. Xt tp cc biu thc ngoc ng cha n cp ngoc trn. Cc biu thc


c sp xp theo th t t in thnh mt danh sch, trong k t ) c
quy nh c th t t in nh hn (. Cc biu thc c nh s t 1 tr i.
V d, vi n = 5 ta c:
S th t
Biu thc
()()()
1
()(())
2
(())()
3
(()())
4
((()))
5
Cho S biu thc ngoc ng c n cp ngoc.
Hy xc nh biu thc th k sau biu thc S trong danh sch.
D liu: Vo t file vn bn BR_LIST.INP:
Dng u tin cha 2 s nguyn n v k (1 n 100, 1 k 1018),
Dng th 2 cha biu thc S.
D liu m bo tn ti li gii.
Kt qu: a ra file vn bn BR_LIST.OUT gm mt dng cha biu thc tm
c.
V d:
BR_LIST.INP
3 2

BR_LIST.OUT

((()))

(())()

Bi 2. n v tn binh c n ngi. Ton n v khng ai ging ai, mi ngi c


mt chiu cao ring. Vin thng s ph trch hun luyn c mt thi quen kh
c o: c 9 gi sng, sau lc ngh gii lao gi bui tp, ra lnh tp hp n v
thnh mt hng dc, ai mun ng ch no trong hng cng c! Vin
thng s s i t u hng n cui hng, ch nh 3 ngi i gip nh bp nu
n. Nhng ngi c ch nh s bc sang phi mt bc. Nu 3 ngi c
ch nh ny lm thnh mt hng c chiu cao tng dn nu nhn t u ca
hng, thng s s rt hi lng. Hm n v s c ngh i n tra ng
gi. Nu thng s khng chn c 3 ngi va theo tiu chun trn th thi
ri, kh nng c ngh v n n cm ng gi ng bng kh nng bn b mt
con c mp mc vi rt cm g H5N1 tn cng gia Xa ha ra! M d nu c
c v ng gi th chc g cn c sc m n.

17

Tuy vy, nu cn thn mt cht th kh nng thot c con thnh n ca


thng s l rt ln.
Hy tnh s kh nng xp hng bao gi cng tm c 3 ngi theo yu cu
v a ra theo m un m.
D liu: Vo t file vn bn LINE_UP.INP gm mt dng cha 2 s nguyn n
v m (3 n 25 000, 1 m 2109).
Kt qu: a ra file vn bn LINE_UP.OUT mt s nguyn s kh nng tm
c theo m un m.
V d:
LINE_UP.INP
5 1000
Cc gii thut c s

LINE_UP.OUT
78

Ngay mc i d tuyn hc sinh vn cn phi c trang b cc gii thut c


bn nh gii thut Dijsktra tm ng i ngn nht, gii thut Kruskal xc nh
cy khung, gii thut so khp KMP, . . .
Cc gii thut cn c trang b 2 mc:
C s ton hc,
C s lp trnh.
Mc c s ton hc cung cp cho hc sinh cc kin thc v bn cht ca s
x l d liu, cch hin thc ha trc tip cc s , cc cu trc d liu
cn t chc. Ni chung, gii thut mc c s ton hc d hiu, d lp trnh,
nhng c phc tp kh cao (thng thng l O(n2) hoc O(nlogn)).
Mc d l c s ton hc nhng sau phn ny hc sinh vn phi bit v nh cc
hm, th tc hin thc ha gii thut. Cc hm, th tc ny nn gii thiu
trc tip cho hc sinh cng vi cc tiu xo t chc d liu v x l (nu c).
C s lp trnh l phn quan trng nht. Cc vn chnh trong trang b c s
lp trnh:
Cc loi cu trc d liu m h thng lp trnh h tr,
L gic nng cao hiu qu ca cc gii thut,
Cc gii thut c hiu nng cao.
Cc kin thc ny cn c trang b cho hc sinh d tuyn v i tuyn hc
sinh c th:
18

Khai thc ht sc mnh ca cng c mnh c,


Nm bt c t duy sng to trong vic tm kim v thit k gii thut,
Khng mt nhiu thi gian v cng sc i vi cc kin thc tr thnh
kinh in.
Vic cung cp cc kin thc v cu trc d liu m h thng lp trnh h tr
khng n thun hc sinh trc tip s dng trong bi ca mnh m quan
trng hn l m rng th gii quan ca hc sinh v cu trc d liu, to hnh
mu hc sinh c nh hng trong vic thit k, t chc d liu v xc nh
b cng c x l d liu . Trn thc t, trong phn ln cc trng hp, khi
gii bi ton olympic ngi lp trnh thng t thit k cc cu trc d liu
tng ng ph hp ti a vi nhu cu x l ca mnh. V vy kin thc
phn ny mang tnh cht nh hng, gip cho hc sinh c tm nhn chin lc
trong qu trnh on nhn v thit k gii thut.
Cc h thng lp trnh hin nay nh Free Pascal 2.6, Dev C++ 4.9.9 u cung
cp nhng th vin khng l h tr ngi dng v u c th mang li nhng
hiu qu tng ng trong lp trnh.
Cc h lp trnh trn C++ u cung cp cc cng c chun ha khi to v x l
cc cu trc d liu thng dng nh stack, heap, vector, deque, dng xp hng
u tin v. v. . . V d, vi cu trc d liu c kiu bt k (c m bo bi h
thng) php c.push() lun lun l np d liu vo cui cu trc, c.pop()
xa phn t cui cng khi cu trc, c.front() ly gi tr ca phn t u
cu trc ra x l, . . . Ty tng loi cu trc, c th c cc php x l chun
khc (np vo u/cui cu trc, xa phn t u/cui cu trc, c phn t
u/cui cu trc, truy nhp vo phn t bn trong, v. v. . .

c.push()

c.back()

c.front()
c.pop_front()

c.push_back()
Cu trc c
Hnh 12
19

c.pop()

Ngoi ra h thng cn cung cp mt b cc php x l phong ph tc ng ln


cu d liu khai bo.
Do tnh chun ha cao, vic gii thiu v nm bt cc cng c ny khng i
hi qu nhiu thi gian v cng sc trong ging dy cng nh hc tp.
Vn quan trng l nm c vai tr, v tr cc cu trc c th p dng
ng lc, ng ch v ng mc, m bo hiu qu lp trnh cao.
Trong CSDL cho cc bi ton olympic (v nhiu bi ton thc t khc) nhng
thuc tnh c dng nhiu nht l gi tr v s th t. C++ cung cp kiu d
liu pair (cp) mt cng c ht sc thun tin v hiu qu lu tr v x
l cp d liu c lin quan l gic ti nhau.
Mt s gii thut c s:
Bn cht v s tip cn trong ging dy cng nh hc tp v trin khai ng
dng khng thay i, nhng cht lng gii thut thay i ph thuc vo cu
trc d liu c la chn v cch gii quyt cc bc bt buc c tnh cht
tin nh ca gii thut hoc lp gii thut . Thng thng mt s bc tr
thnh nhng bi ton con thuc lp gii thut khc. Nh vy, yu t gii thut
kp xut hin ngay c trong vic xy dng c s.
Ni dung ca phn trang b kin thc c s:
Bn cht ca vn ,
Cc cch gii quyt,
Gii thut hiu qu nht.
Bn cht ca vn : Xt cc vn n gin, thng gp trong vic gii quyt
cc bi ton, gii thiu vai tr, v tr ca bi ton trong l thuyt gii thut. Vn
c th c xem xt trc tip t m hnh ton hc.
Cc cch gii quyt: Nu ngn gn cc gii thut n gin, hin nhin, d lp
trnh nhng c phc tp cao (O(n3), O(n2)). Phn ny h tr cho hc sinh
hiu su hn bn cht ca bi ton, thy c l gic pht trin, t :
Nhanh chng nm bt c t tng ca gii thut hiu qu nht s xt,
Trang b cho hc sinh phng php t duy sng to, ng li ci tin,
pht trin gii thut.
Cc cch gii quyt hin nhin, tm thng ny vn c tc dng nht nh
trong lp trnh, c bit khi cc bi ton (hoc bi ton con) c kch thc nh.

20

Do tnh n gin ca vn , vic lp trnh cho cc gii thut c th giao cho


hc sinh nh cc bi tp ph, b sung.
Gii thut c hiu qu nht: Ni dung ca phn ny l gii thiu cc gii thut
phc tp O(nlogn) hoc O(n) gii quyt bi ton c s nu.
Hc sinh cn nm c:
tng ci tin: Khu no ca qu trnh x l cn ci tin,
Cu trc d liu v s x l,
Lp trnh thnh tho gii thut ang xt.
Vic nm c tng ci tin l iu quan trng v n l kim ch nam hc
sinh c cch tip cn sng to, linh hot vi cc bi tp, bi thi v cc bi ton
thc t sau ny. l mt trong s cc mc tiu quan trng trong vic o to,
bi dng hc sinh nng khiu.
Quy hoch ng:
Vi mi bi ton ng dng gii thut quy hoch ng, ta vn phi tr li r
rng, chnh xc 6 cu hi:
Tn v ngha cc bin phc v s lp,
Cch khai bo cc bin ,
S (cng thc) lp chuyn t mt bc sang bc tip theo,
Gi tr u ca cc bin tham gia tnh lp,
Tham s iu khin lp: thay i t u n u,
Kt qu: u v lm th no dn xut ra.
Cc cch tr li khc nhau s dn n nhng gii thut khc nhau c v cch
thc hin ln phc tp.
V d, bi ton tm dy con tng dn di nht:
Cho dy s nguyn a1, a2, . . ., an. Hy tm dy con nhiu phn t nht ca dy
cho to thnh mt dy tng dn nu gi nguyn trnh t trc sau nh
trong dy ban u.
y l bi ton quan trng thng gp trong nhiu lnh vc khoa hc khc nhau
v trong thc t.
Gii thut I: Quy hoch ng cu phng.
c im gii thut:
phc tp O(n2),
21

n gin, ph hp vi vic gii thiu t tng quy hoach ng,


D lp trnh,
Thch hp vi cc bi ton kch thc nh.
D liu: dng 2 mng p1, p2, . . ., pn v d1, d2, . . ., dn, trong :
pi ch s ca phn t trc phn t ai trong dy con tng dn di nht
cha phn t ai trong dy a1, a2, . . ., ai,
di di dy con tng dn di nht cha phn t ai trong dy a1, a2, . . .,
ai .
Khai bo: cc mng p v d c th khai bo tnh v kch thc nh v gii thut
s s dng ht cc phn t trong mng, t 1 n n. Mng d nn khai bo t 0.
S lp: Gi thit tnh c pj v dj, j = 1 i-1.
Tm k tha mn dk = max{dj| aj < ai, j = 1 i-1}. Nu khng tn ti aj< ai
th k = 0.
Gn pi = k v di = dk + 1.
Gi tr u: p1 = 0, d0 = 0, d1 =1.
Phm vi lp: Cng thc lp c tnh vi i thay i t 2 ti n.
Kt qu:
Gi m l di dy con tng dn di nht, m = dk = max{di, i = 1 n}.
Dn xut dy con tm c: cc phn t ca dy con, theo th t t ln
n nh l a[k], a[p[k]], a[p[p[k]]], . . .
dn xut cc phn t theo gi tr tng dn ta c th:
Np cc gi tr vo stack (khi cn khai bo thm mng mi) sau
a t stack ra,
Dng mng d nh du cc phn t thuc dy con v sau duyt t 1
n n a ra cc phn t ai tng ng vi di c nh du:

Hnh 13
22

Lu : thun tin cho vic dn xut dy con, trnh phi nh du ta c th


duyt t n v 1 v thay i mt cch thch hp cch tnh dk.
on chng trnh tng ng vi phn chnh ca gii thut:

Hnh 14
Gii thut II. Quy hoch ng v tm lim nh phn.
c im gii thut:
phc tp O(nlogn),
Lp trnh tng i phc tp,
L m hnh mu cho gim phc tp cho rt nhiu bi ton quy
hoch ng.
D liu: dng 2 mng P= (p1, p2, . . ., pn) v M = (m1, m2, . . ., mn), trong :
pi ch s ca phn t trc phn t ai trong dy con tng dn di nht
cha phn t ai trong dy a1, a2, . . ., ai,
mj v tr ca phn t ak nh nht dy con tng dn c di ng
bng j trong dy a1, a2, . . ., ai.
Nu cn dn xut dy con: cn thm mng B = (b1, b2, . . ., bn). Tn ti
cch vng trnh vic s dng mng ny!
Khai bo: mng p c th khai bo tnh v gii thut s s dng tt c cc phn t
t p1 n pn, mng m c th khai bo ng (v d, kiu vector) v s phn t
c s dng ng bng di ca dy con tm c. Mng B c th khai bo
di dng mng ng hoc stack.
S lp: Gi thit tnh c pj v mj, j = 1 i-1. di dy con tng dn
di nht hin ti l L.

23

Trng tm ca gii thut l cp nht M: tm kim nh phn j dng ln


nht: j L v am[j]<ai (hoc j = 0 nu khng tn ti ch s tha mn 2 iu
kin trn),
Cp nht pi (v L, M nu cn):
pi = mj,
Nu c thay i di: cp nht L v M:
iu kin thay i: j = L hoc ai < am[j+1],
Cp nht: mj+1 = i, L = max{l, j+1}.
Gi tr u: L = 0, m0 = 0, gi tr hng ro: a0 = -.
Phm vi lp: S lp c thc hin vi i thay i t 1 ti n.
Kt qu:
di dy con tm c: L,
Dn xut dy con tm c: cc phn t ca dy con, theo th t t ln
n nh l ap[m[L]], ap[p[m[L]]], ap[p[p[m[L]]]], . . .
Vic dn xut dy con c thc hin tng t nh gii thut trn.
Nhn xt:
Hiu qu gii thut ph thuc vo cch lu tr d liu v tm kim phn
t mc ni tip theo. phc tp ca gii thut s cn gim nu ta t
chc lu tr cc thng tin ny di dng cy thch hp v t c th
thc hin tm kim nhanh hn. Mt trong s cc cch ci tin l s dng
cy Van Emde Boar ,
Cc loi cu trc cy ng vai tr rt quan trng trong vic gii cc bi
ton tin hc, v vy kin thc v cc loi cy v gii thut lin quan tr
thnh mt phn quan trng ca khi kin thc c s cn trang b cho hc
sinh,
c li gii hiu qu ngi lp trnh phi tch hp nhiu gii thut c
s khc nhau trong vic gii quyt cc bi ton con dn xut (phng
php Gii thut kp). Nh vy s tn ti vi ba CSDL h tr, chng
trnh gii s mang cc yu t ca mt h tr tu nhn to!

24

Hnh 15
25

Hnh 16

26

Ghi ch: vi cc b d liu ngu nhin c n = 400 000, thi gian thc hin
chng trnh xp x c:
Chng trnh PASCAL: 0.117 giy (Processor Core i7 1.80GHz ),
Chng trnh C++: 0.201 giy (Processor Core i7 1.80GHz).
Hm tin t
Xt dy s nguyn A = (a1, a2, . . ., an). Dy con cc phn t lin tip nhau B =
(ai, ai+1, . . ., aj) c gi l tin t ca A nu ai = a1, ai+1 = a2, . . ., aj = aj-i+1 (i >
1).
V d, vi dy A = (5, 3, 5, 5, 3, 4, 5, 3, 5, 5, 3, 6) ta c cc dy tin t nu
hnh bn.
Dy s P = (p1, p2, . . ., pn) gi l hm tin
t ca A nu pi l di ca dy tin t di
nht kt thc bi phn t ai-1, p1 = 0.

5, 3, 5, 5, 3, 4, 5, 3, 5, 5, 3, 6

Vi v d trn ta c P = (0, 0, 0, 1, 1, 2, 0,
1, 2, 3, 4, 5).
Yu cu: Cho n v dy s A. Hy xc nh
hm tin t P.

Cc dy tin t

D liu: Vo t file vn bn FPRE.INP:


Dng u tin cha s nguyn n (1
Hnh 17
6
n 10 ),
Dng th 2 cha n s nguyn a1, a2, . . ., an (|ai| 109).
Kt qu: a ra file vn bn FPRE.OUT n s nguyn xc nh hm P.
V d:
FPRE.INP

FPRE.OUT

12
5 3 5 5 3 4 5 3 5 5 3 6

0 0 0 1 1 2 0 1 2 3 4 5

27

Gii thut phc tp O(n)

Hnh 18. S khi ca gii thut. Cc phn t nh s bt u t 0.

Program P7_50;
Uses SysUtils,DateUtils;
const tfi='FPRE.INP';
tfo='FPRE.OUT';
Var fi,fo:text;
a,p:array[0..1000000]of longint;
n,i,j:longint;
x1,x2,x3,x4,x5,mm1,mm2,ss1,ss2:word;
BEGIN
DecodeDateTime(Now,x1,x2,x3,x4,x5,ss1,mm1);
assign(fi,tfi); reset(fi);
readln(fi,n);
for i:=1 to n do read(fi,a[i]);
close(fi); fillchar(p,sizeof(p),0);
i:=3;j:=0;
while i<=n do
if a[i-1]=a[j+1] then begin p[i]:=j+1; inc(i);inc(j) end
else if j>0 then j:=p[j]
else begin p[i]:=0; inc(i) end;

28

assign(fo,tfo); rewrite(fo);
for i:=1 to n do write(fo,p[i],' ');
DecodeDateTime(Now,x1,x2,x3,x4,x5,ss2,mm2);
writeln(fo);
i:=ss2-ss1; j:=mm2; j:=j-mm1;
if j<0 then begin j:=j+1000; dec(i) end;
writeln(fo,'Time: ',i,'.',j,' sec.');
close(fo)
END.

Chng trnh PASCAL. Cc phn t nh s bt u t 1.

include <fstream>
#include <ctime>
using namespace std;
int a[1000000],p[1000000]={0},n;
ifstream fi ("FPRE.IN1");
ofstream fo ("FPRE.OU1");
void get_p()
{int i,j;
i=2; j=0; p[0]=0;p[1]=0;
while(i<n)
if(a[i-1]==a[j])p[i++]=++j; else
if(j>0)j=p[j]; else p[i++]=0;
}
int main()
{
clock_t aa=clock();
fi>>n;
for(int i=0;i<n;++i) fi>>a[i];
get_p();
for(int i=0;i<n;++i) fo<<p[i]<<" ";
clock_t bb=clock();
fo<<endl<<"Time: "<<double(bb-aa)/1000 << " seconds."<< endl;
}

Hnh 19. Chng trnh C++. Cc phn t nh s bt u t 0.

29

Tm Min Max
Tm Min (hoc Max) ca mt dy s l bi ton kinh in trong c s lp trnh.
Khi gii thiu v k thut lp trnh v ngn ng lp trnh bao gi ngi ta cng
phi xt

bi ton tm Min {ai} hoc Max {ai}


i=1 n

i=1 n

Vic tm cc tr ch thc hin mt ln trn i tng cho.


Trong cc bi ton Olympic v bi ton thc t vn thng gp l tm cc tr
trong khong con cc phn t lin tip t i n i+m hoc tm gi tr ln hn
(nh hn) tip theo v vic tm kim ny cn thc hin nhiu ln. Cc quy lut
ca trit hc th hin rt trc gic trong tin hc. Mt trong nhng quy lut l
Khi s lng thay i n mt mc no th s dn n nhng thay i v
cht lng. Chnh v vy khi chng ta c my tnh mnh hn, c h thng hon
thin hn, c cng c lp trnh cho php khai thc ti a kh nng ca h thng
th ngi ta i hi chng ta phi gii quyt nhng bi ton c kch thc ln
hn v nhng iu ny buc chng ta phi c cch tip cn khc trong mi vn
, k c xc nh v gii quyt cc vn c s.
gii quyt vn ny ngi ta t chc mt hng i u tin q lu tr cc
phn t tim nng. C nhiu cch khai bo q. Cch tit kim b nh nht l
dng hng i vng trn kch thc m. Cch n gin nht v ph hp vi mi
loi ngn ng l khai bo mng mt chiu t 0 ti n.
Xt A = (a1, a2, . . ., an) vi 0 ai 109, 1 m n 106. Yu cu xc nh B
= (b1, b2, . . ., bn), trong

min {aj} , vi i <m,


j=1 i

bi =

min {aj} ,

vi m i n.

j=i-m+1 i

Cn gi thiu cc gii thut phc tp O(n2) trc khi chuyn sang gii thut
ti u nh sau:
Khai bo:
Var q:array[0..1000000]of longint; hoc int q[1000001];

30

Chun b:
a[0]:=-1;
q[0]:=0;
ie:=0;ib:=1;

a[0]=-1;
q[0]=0;
ie=0;ib=1;
Hnh 20

X l: Vi i = 1 n:
Chng no a[qie]a[i] dec(ie),
inc(ie); qie:=i;
if ie<ib ib:=ie;
if ie-ib = m inc(ib);
bi:= a[qib];
Nhn xt: phc tp ca gii thut l O(n).
V d: Mt nh my lc du c kh nng x l m tn du th mi ngy. Bn
cha c kh nng d tr du cho nh my lm vic lin tc k ngy. nh k c
sau n ngy lm vic th phi dng sn xut tin hnh bo dng. Trc khi
bo dng, tc l sau ngy lm vic th n, ton b du trong bn cha phi
c s dng ht.
Phng Nguyn liu Vt t c mt chuyn gia kinh t rt gii. Tuy khng ni
c chnh xc gi du, nhng da trn c s tng hp v phn tch d liu ton
cu anh ta ln c biu bin ng gi du ca nhiu ngy v pha trc do
xc nh c nhng ngy v s lng du cn mua b sung vo bn cha
chi ph u vo lin quan ti du th l nh nht.
Tht ng kinh ngc l trong sut chu k sn xut t ngy u tin sau bo
dng cho n ngy cui cng trc t bo dng tip theo, da vo bng k
gi du thc t ci/tn ca ngy th i ( i = 1 n) ngi ta thy rng du th
c mua mt cch ti u.
hch ton chi ph sn xut hy tnh gi trung bnh mt tn du m nh my
mua trong sut chu k hot ng lin tc ca nh my.
D liu: Vo t file vn bn OIL.INP:
Dng u tin cha 3 s nguyn n, m v k (1 k n 106,1 m 104),
Dng th 2 cha n s nguyn c1, c2, . . ., cn (1 ci 105, i = 1 n).

31

Kt qu: a ra file vn bn OIL.OUT mt s thc vi 4 ch s sau du chm


thp phn gi trung bnh mt tn du m nh my mua.
V d:
OIL.INP

OIL.OUT

10 5 3
3 1 2 3 4 5 2 4 1 3

1.7000

Program OIL_P;
Uses SysUtils,DateUtils;
const tfi='OIL.IN1';
tfo='OIL.OU1';
Var n,m,k,i,ie,ib:longint;
b,c,q:array[0..1000000] of longint;
fi,fo:text;
v:real;
x1,x2,x3,x4,x5,ss1,ss2,mm1,mm2:word;
BEGIN
DecodeDateTime(Now,x1,x2,x3,x4,x5,ss1,mm1);
assign(fi,tfi); reset(fi);
readln(fi,n,m,k);
for i:=1 to n do read(fi,c[i]);
close(fi);
c[0]:=-1; q[0]:=0;ie:=0; ib:=1;
for i:=1 to n do
begin
while c[q[ie]]>=c[i] do dec(ie);
inc(ie);q[ie]:=i;
if ie<ib then ib:=ie;
if q[ie]-q[ib]=k then inc(ib);
b[i]:=q[ib]
end;
v:=0;
for i:=1 to n do v:=v+c[b[i]];
v:=v/n;
assign(fo,tfo); rewrite(fo);
writeln(fo,v:0:4);
DecodeDateTime(Now,x1,x2,x3,x4,x5,ss2,mm2);
writeln(fo,'N = ',n,' M = ',m,' K = ',k);
ie:=ss2-ss1; ib:=mm2; ib:=ib-mm1;
if ib<0 then begin ib:=ib+1000; dec(ie) end;
writeln(fo,'Time: ',ie,'.',ib,' sec.');
close(fo)
END.

Hnh 21
32

Thc hin:
N = 999999 M = 100 K = 29
Time: 0.199 sec.
Thi gian x l: 0.140 sec.
#include <fstream>
#include <iomanip>
#include <ctime>
using namespace std;
ifstream fi ("OIL.INP");
ofstream fo ("OIL.OUP");
float v;
int n, m, k, ie, ib;
int c[1000001],q[1000001],b[1000001];
int main()
{clock_t aa=clock();
fi>>n>>m>>k;
//int c[n+1], q[n+1],b[n+1];
for(int i=1;i<=n;++i) fi>>c[i];
c[0]=-1; q[0]=0;ie=0;ib=1;
for(int i=1;i<=n;++i)
{while(c[q[ie]]>=c[i])--ie;
q[++ie]=i;
if(ie<ib)ib=ie;
if(q[ie]-q[ib]==k)ib++;
b[i]=q[ib];
}
v=0;
for(int i=1;i<=n;++i) v+=c[b[i]];
v/=(float)n;
fo<<fixed<<setprecision(4)<<v<<endl;
clock_t bb=clock();
fo<<" N = "<<n<<" M = "<<m<<" K = "<<k;
fo<<endl<<"Time: "<<double(bb-aa)/1000 <<" seconds."<< endl;
}

Hnh 22
Thc hin:
N = 999999 M = 100 K = 29
Time: 0.3100 seconds.
Thi gian x l: 0.020 seconds.

33

Nhn xt:
bi ton trn m khng tham gia tnh ton!
Thay v lu tr min, ta c th lu tr ch s, ni t min,
C cch t chc tnh ton vi t b nh cn khai bo. Nhng iu ny s
lm chng trnh tr nn phc tp hn v tn nhiu thi gian lp trnh.
kho st v nh gi, cc chng trnh di y u c a thm mt
thng tin ph ra file output.
C th tn dng cc cng c t chc d liu do h thng lp trnh cung
cp,
Vic khai thc hp l cc cng c ny s lm chng trnh sng sa, d
hiu v d lp trnh hn,
Vi cc cc bi ton nh, n gin vic s dng thun ty cc cng c t
chc d liu do h thng lp trnh cung cp s dn n vic tng thi gian
thc hin (do phi phc v cc php x l vi cu trc),
lp trnh hiu qu nn thc hin qua 2 bc:
Bc 1: Xy dng chng trnh hot ng ng da trn cc cng
c ca h thng lp trnh,
Bc 2: Ci tin chng trnh nhn c bng cch thay mt s
php x l chun vi cu trc d liu bng cc php truy nhp trc
tip hiu qu hn.
Di y l v d v chng trnh gii quyt bi ton trn,thun ty ch s dng
cc cng c phc v x l hng i hai u.

34

#include <fstream>
#include <iomanip>
#include<deque>
#include <ctime>
using namespace std;
ifstream fi ("OIL.INP");
ofstream fo ("OIL.OUT");
float v;
int n, m, k;
int c[1000001],b[1000001];
deque<int>q;
int main()
{clock_t aa=clock();
fi>>n>>m>>k;
for(int i=1;i<=n;++i) fi>>c[i];
clock_t cc=clock();
for(int i=1;i<=n;++i)
{while(!q.empty() && c[q.back()]>=c[i])q.pop_back();
q.push_back(i);
if(q.back()-q.front()>=k)q.pop_front();
b[i]=q.front();
}
v=0;
for(int i=1;i<=n;++i) v+=c[b[i]];
v/=(float)n;
fo<<fixed<<setprecision(4)<<v<<endl;
clock_t bb=clock();
fo<<endl;
fo<<" N = "<<n<<" M = "<<m<<" K = "<<k;
fo<<endl<<"Time Full: "<<double(bb-aa)/1000 <<" seconds."<< endl;
fo<<endl<<"Time EXT: "<<double(bb-cc)/1000 <<" seconds."<< endl;

Hnh 23
Thc hin:
N = 999999 M = 100 K = 29
Time Full: 0.3800 seconds.
Time EXT: 0.1200 seconds.

35

T chc v qun l interval, segment


Cc vn ny c c trnh by rt chi tit trong bi ging ca thy
L Minh Hong nm 2011, v vy y ta khng nhc li c s l thuyt v s
tnh ton. Ch cn lu rng y l cc gii thut ht sc hiu qu gii
quyt nhiu bi ton thng gp v l mt thnh phn quan trng trong c s
gii thut m ta phi trang b cho hc sinh.
Kiu d liu cp (pair)
D liu kiu cp l mt loi d liu c cu trc dng lu tr gi tr v thuc
tnh nh mt n v d liu thun tin x l.
Mt c s d liu n gin c th xy dng t cc d liu loi cp.
Ngn ng lp trnh C++ cung cp kiu pair lu tr v x l d liu cp.
Vi kiu d liu ny ta c th t chc cc d liu cp n, mng d liu cp v
mng d liu nhiu tng cp. L kiu d liu ca mt ngn ng hng i
tng, d liu kiu pair c nhn c s phc v ca mi php x l nh
cc loi d liu khc.
Khai bo:

Kiu d liu th II

Kiu d liu th I

pair<int,int> a, b[100];
Hnh 24
Truy nhp:
b[3].first

1
0

a.first

b
a

3
0

5
0

. . .
a
. a
. a
.

a.second
b[3].second

Hnh 25

36

V d: Xt bi ton:
Lng tr em khuyt tt SOS c m hc sinh. Lng thng nhn c s quan
tm, ti tr ca cc t chc, c nhn trong v ngoi nc. Trung thu nm nay,
trong s cc qu khc nhau gi ti c n hp ko. Trong danh sch ghi nhn, cc
hp c nh s t 1 n n, hp th i c ai vin ko. Cc thy c mun ly
mt hoc mt s hp lin tc nhau trong danh sch. iu quan trng l tt c
ko trong cc hp ly ra u phi
chia ht cho cc em v s vin ko
mi em phi nhn c l nh
nhau.
Hy xc nh xem cc thy c c
bao nhiu cch khc nhau chn cc
hp ko. Hai cch chn gi l khc
nhau nu khc nhau im u hoc
im cui hay c hai. V d, vi m
= 10, n = 4 v s ko trong cc hp
Hnh 26
ln lt l 15, 50, 225, 60 ta c 4
cch chn (Xem hnh 25).
Trong s cc cch chn cc thy c s chn cch m nhiu hp nht v qu trnh
m hp cng mang li cho cc em hc sinh s thch th v hi hp, thm ch
cn ln hn c vic c bao nhiu ko s c nhn.
D liu: Vo t file vn bn CANDY.INP:
Dng u tin cha 2 s nguyn m v n (1 m 1000, 1 n 106),
Dng th 2 cha n s nguyn a1, a2, . . ., an (1 ai 109, i = 1 n).
Cc s trn mt dng cch nhau mt du cch.
Kt qu: a ra file vn bn CANDY.OUT
Dng th nht cha mt s nguyn s cch chn khc nhau. Nu khng
tn ti cch chn th kt qu s l 0.
Nu c cch chn th dng th 2 cha 2 s nguyn: s ca hp u v s
ca hp cui trong dy hp c chn.
V d:
APPLES.INP
10 4
15 50 225 60

APPLES.OUT
4
1 4
37

Phn tch gii thut:


Mi bi ton lin quan ti on lin tc ca mt i tng no (dy s, xu, .
. .) u i hi phi xy dng hm tch ly f(i) t u n v tr th i ca i
tng. Tnh cht f(i) ph thuc vo bn cht ca vn phi xc nh.
Bi ton trn lin quan ti vn chia ht v vy ta cn tnh
i

f(i) f i ( a j ) mod m.
j 1

Vi nh ngha fi nh trn ta c th tnh n theo s lp:

f0 = 0, fi = (fi-1 +ai) mod m, i = 1 n


Trong bi ton ny cc gi tr ai s khng tham gia vo cc x l tip theo do
khng cn lu tr. Nh vy y khng n thun nhp d liu m l ghi nhn
d liu, tc l tnh v lu cc thuc tnh tng ng vi d liu thay v cho vic
lu d liu.
Cc yu cu lin quan ti xc nh cu hnh c th i hi phi lu tr fi vi cc
thng tin cu hnh lin quan thnh mt cm d liu (Bng quan h). Vi cc
ngn ng khng hng i tng (nh PASCAL) mi quan h c xc nh
thng qua gii thut, ngay c khi lu tr chng di dng Record. V vy, vi
cc ngn ng ny cc gi tr thuc tnh nn lu di dng c lp bng cc cu
trc n gin, nh vy s hiu qu hn trong x l.
Vi cc ngn ng hng i tng ( nh C++), fi v cc thuc tnh ca n lu
thnh mt i tng v ta c th khai thc mi dch v vi i tng to ra.
Trong bi ton ny, i tng cn xt l cp (fi, i).
Ta phi tm 2 cp (fu, u) v (fv, v) tha mn:
fu = fv, 1 u v n,

Max {i j }

1 i n
fi = fj

38

#include <fstream>
#include<ctime>
using namespace std;
int n,m,r,u,v,t,ux,vx,tx,d[1000];
pair<int,int>b[1000002];
ifstream fi ("Candy.inp");
ofstream fo ("Candy.oup");
int main()
{clock_t aa=clock();
fi>>m>>n;
b[0].first=0; b[0].second=0;
memset(d,0,sizeof(d)); d[0]=1;
for(int i=1;i<=n;++i)
{fi>>t;
b[i].first=(b[i-1].first+t)%m;
b[i].second=i;
d[b[i].first]++;
}
clock_t cc=clock();
b[n+1].first=m; b[n+1].second=n+1;
r=0;
for(int i=0;i<m;++i)r+=d[i]*(d[i]-1)/2;
sort(b,b+n+1);
tx=0;u=-1;
for(int i=0;i<=n;++i)
if(u<0 && b[i].first==b[i+1].first){u=i;continue;}
else if(u>=0 && b[i].first!=b[i+1].first)
{v=i;t=b[v].second-b[u].second;
if(t>tx){ux=u; vx=v;tx=t;}
u=-1;}
fo<<r<<endl;
if(r>0)fo<<b[ux].second+1<<" "<<b[vx].second<<endl;
clock_t bb=clock();
fo<<"M = "<<m<<" N = "<<n<<endl;
fo<<"Time Extc: "<<(double)(bb-cc)/1000<<" sec."<<endl;
fo<<"Time Full: "<<(double)(bb-aa)/1000<<" sec.";
}

Hnh 27
Kt qu th nghim:

705038296
2 999984
M = 100 N = 1000000
Time Extc: 0.281 sec.
Time Full: 0.531 sec.
39

Program Candy;
Uses SysUtils,DateUtils;
Const tfi='Candy.in1';
tfo='Candy.out';
Var m,n,v,u,r,t,tx,ux,vx,i:longint;
a,b:array[0..1000001] of longint;
d:array[0..1000] of longint;
fi,fo:text;
x1,x2,x3,x4,x5,ss1,ss2,ss3,mm1,mm2,mm3:word;
Procedure QSort(left : longint; right : longint);
Var pivot,pv_b, l_ptr, r_ptr : longint;
Begin
l_ptr := left;
r_ptr := right;
pivot := a[left];
pv_b := b[left];
While (left < right) do
Begin
While (((a[right] > pivot) OR ((a[right] = pivot )AND
(b[right] > pv_b)))
AND (left < right)) do
right := right - 1;
If (left <> right) then
Begin
a[left] := a[right];
b[left] := b[right];
left := left + 1;
End;
While (((a[left] < pivot) OR ((a[left] = pivot )AND
(b[left] < pv_b)))
AND (left < right)) do
left := left + 1;
If (left <> right) then
Begin
a[right] := a[left];
b[right] := b[left];
right := right - 1;
End;
End;
a[left] := pivot; b[left] :=pv_b;
pivot := left;
left := l_ptr;
right := r_ptr;
If (left < pivot) then
QSort(left, pivot-1);
If (right > pivot) then
QSort(pivot+1, right);
End;
BEGIN
40

DecodeDateTime(Now,x1,x2,x3,x4,x5,ss1,mm1);
assign(fi,tfi); reset(fi);
readln(fi,m,n);
a[0]:=0;b[0]:=0;
fillchar(d,sizeof(d),0); d[0]:=1;
for i:=1 to n do
begin
read(fi,t);
a[i]:=(a[i-1]+t) mod m;
b[i]:=i;
inc(d[a[i]])
end;
close(fi);
DecodeDateTime(Now,x1,x2,x3,x4,x5,ss3,mm3);
a[n+1]:=m;b[n+1]:=n+1;
r:=0;
for i:=0 to m-1 do r:=r+d[i]*(d[i]-1) div 2;
qsort(0,n+1);
tx:=0; u:=-1;
for i:=0 to n do
begin
if (u<0) and (a[i]=a[i+1]) then begin u:=i; continue end
else if (u>=0) and (a[i]<>a[i+1]) then
begin
v:=i; t:=b[v]-b[u];
if t>tx then begin ux:=u; vx:=v; tx:=t end;
u:=-1
end
end;
assign(fo,tfo);rewrite(fo);
writeln(fo,r);
if r>0 then writeln(fo,b[ux]+1,' ',b[vx]);
DecodeDateTime(Now,x1,x2,x3,x4,x5,ss2,mm2);
writeln(fo,'M = ',m,' N = ',n);
u:=ss2-ss3; v:=mm2;v:=v-mm3; if v<0 then begin dec(u);
v:=v+1000 end;
writeln(fo,'Time Exct: ',u,'.',v,'sec.');
u:=ss2-ss1; v:=mm2-mm1; if v<0 then begin dec(u); v:=v+1000
end;
writeln(fo,'Time Full: ',u,'.',v,'sec.');
close(fo)
END.

Kt qu th nghim:

705038296
2 999984
M = 100 N = 1000000
Time Exct: 0.234sec.
Time Full: 0.330sec.
41

Nhn xt:
Thi gian x l vi i tng trong C++ khng nh hng nhiu n tc
x l (vi n = 106, vic sp xp, tm kim trong C++ cn 0.281 giy,
vi s x l i tng n tng t trong PASCAL cn 0.234 giy),
Khi sp xp phi m bo th t b phn ca (fi, i), cc chng trnh sp
xp ca C++ m bo yu cu ny i d liu kiu pair,
Yu cu th nht (tnh s lng cch chn) c th ghp ngay vo qu
trnh ghi nhn d liu v mang li hiu qu cao hn khi m ln:
b[0].first=0; b[0].second=0;r=0;
memset(d,0,sizeof(d)); d[0]=1;
for(int i=1;i<=n;++i)
{fi>>t;
b[i].first=(b[i-1].first+t)%m;
b[i].second=i;
r+= d[b[i].first]++;
}
Hnh 28
Do hn ch v khun kh ti liu, y ta khng xem xt cc gii thut
n gin nhng c phc tp cao hn, tuy vy hc sinh cn phi c
lm quen vi cc gii thut ny (nhng khng nht thit phi lp trnh)
trc khi i su vo gii thut ti u,
Gii thut nu trn c phc tp O(nlogn) do i hi phi sp xp.
Cc gii thut c s quen thuc ngy nay cng c t chc trin khai mt cch
c hiu qu hn trn nn ca cc h thng lp trnh hin c. Nh cch nhn ca
th gii i vi phn kin thc c s cng c nhng chuyn dch nht nh.
Chng ta cng phi lm cho hc sinh nhn thy v chuyn dch theo!
V d, gii thut tm ng i ngn nht Dijsktra c trin khai c hiu qu
da trn vic s dng hng i u tin (Priority Queue):
Const int INF = 1000000000;
int main()
{int n;

42

. . . c n . . .
vector < vector < pair<int,int> > > g (n);
... c d liu v th ...
int s = ...; // nh xut pht
vector<int> d (n, INF), p (n);
d[s] = 0;
priority_queue < pair<int,int> > q;
q.push (make_pair (0, s));
while (!q.empty())
{ int v = q.top().second, cur_d = -q.top().first;
q.pop();
if (cur_d > d[v]) continue;
for (size_t j=0; j<g[v].size(); ++j)
{ int to = g[v][j].first,
len = g[v][j].second;
if (d[v] + len < d[to])
{ d[to] = d[v] + len;
p[to] = v;
q.push (make_pair (-d[to], to));
}
}
}
}

K thut lp trnh
Bn cnh cc kin thc v gii thut, k thut lp trnh cng l mt l mt thnh
t quan trng trong vic trang b kin thc c s.
Cc kin thc v k thut lp trnh c trnh by c lp hoc an xen vi vic
ci t gii thut c s.
Mt s vn c bn trong k thut lp trnh m hc sinh cn nm bt l:
K thut thit k chng trnh,
K thut bng phng n,
K thut hng ro,
K thut x l vng trn v t chc hng i vng trn,
K thut tuyn tnh ha chng trnh,
K thut t chc iu khin tm kim ng,
K thut lp trnh theo nguyn l Macro,
Lp trnh l gic,
. . . . . . .
Ni chung, vn k thut lp trnh mang nhiu yu t ngh thut. Vo nhng
nm 80 ca th k 20, nhiu ngi mun bin lp trnh t mt ngh thut sang
thnh khoa hc lp trnh. Nhng nh ngi La m thng ni Ci g ca
43

Cesar th phi tr li cho Cesar, lp trnh vn mang trong n yu t ngh


thut!
Nhng yu t ngh thut l mt thnh phn khng th tch ri trong tin hc.
C nhiu mc trong cc vn nu trn c xem xt cc t lm vic
trc. Nhng nhng ln cc vn c xem xt c lp v kho st kh
su. Cc vn lin quan n c s - ngn gn v n gin hn. Nhng vn
ny tng i c lp vi yu cu hin nay ca th gii v nh hng gii
thut v vy ta s khng i su y, trong t lm vic ny.
Th gin v tch hp kin thc
gim p lc tm l v ng thi khng lm hc sinh sao nhng cc mn hc
cn li, chng ta cn chun b mt s bi tp tng i n gin vi ni dung
ly t cc mn hc khc (vn, s , a, l,ha, sinh, . . .). Phn nn
(background) phi c pht biu ngn gn nhng tuyt i chnh xc v kin
thc khoa hc v nhn mnh cho hc sinh r v s chnh xc . Phn d liu
v yu cu tnh ton l t do (v cng cn lu hc sinh v s t do ny nu c
hc sinh khng b ln gia thc v o).
V d:
Bi 1. TH NG LUT
Trong ting Vit, cc t khng du hoc c du huyn thuc thanh bng, trong
trng hp ngc li t thuc thanh trc.
Th ng lut c mt h thng quy tc phc tp c th hin 5 iu
nghim khc sau: Lut, nim, vn, i v b cc. Xt mt bi th ng lut
tht ngn bt c (8 cu, mi cu 7 t). Nu ch th 2 ca cu u tin dng
thanh bng th gi l bi c "lut bng"; nu ch th 2 cu u dng thanh trc
th gi l bi c "lut trc". Trong mt cu, ch th 2 v ch th 6 phi ging
nhau v thanh iu, v ch th 4 phi khc hai ch kia. V d, nu ch th 2 v
6 l thanh bng th ch th 4 phi dng thanh trc, hay ngc li. Nu mt cu
th ng m khng theo quy nh ny th c gi "tht lut".
Thng tin v bi th c cho di dng 8 au, mi au 7 k t xc nh t
thuc thanh bng hay trc, k t - tng ng t thuc thanh bng v + nu
t thuc thanh trc.

44

V d, thng tin v bi Qua o Ngang ca B Huyn Thanh Quan c dng nh


sau:

Hnh 29. Bi th Qua o Ngang

Thng tin m ha

Cnh o Ngang

Hy lp trnh xc nh bi th thuc loi lut no hay tht lut v a ra s 1


nu l lut bng, s 2 nu l lut trc v s 3 nu l tht lut.
D liu: Vo t file vn bn POETRY.INP gm 8 dng, mi dng mt xu 7
k t t tp {-, +}.
Kt qu: a ra file vn bn POETRY.OUT mt s nguyn loi lut ac nh
c.
V d:
POETRY.INP
++--+++--++---++--+
++--++++---++
--+++---++--+
++---+-

POETRY.OUT
2

Bi tp v nh: Tm mt s bi th ng lut tht ngn bt c ca B Huyn Thanh Quan,


Nguyn Khuyn, H Aun Hng, m ha v loi lut ca chng. Em c nhn xt g v cch
lm th ca cc tc gi trn?

Bi 2. 100 km/h
Trn tri t bt c xe t no cng c th t tc 100 km/h sau 3 giy! Bn
khng tin vo iu ? Vy hy y chic xe xung t mt vch dng
ng cao.

45

Hy tnh cao ti thiu (theo mt) cn c ca vch sau 3 giy t t


vn tc 100km/h v a ra mn hnh cao tnh c vi chnh xc 1 ch s
sau du chm thp phn. Gia tc ri t do g = 9.8m/s2.
Nu mt trng, cn bao nhiu thi gian t vn tc 100 km/h v cao ca
vch phi l bao nhiu?
hnh tinh c gia tc ri t do p (0 < p 100) cn bao nhiu thi gian t
vn tc 100 km/h v cao ca vch phi l bao nhiu? D liu nhp t bn
phm v kt qu - a ra mn hnh.
Bi 3. DEOXYRIBONUCLEIC AXID
Deoxyribonucleic axid (DNA) l mt trong hai loi a xit mang thng tin di
truyn m ha cho hot ng sinh trng v pht trin ca cc dng sng.
V mt ho hc, cc DNA c cu thnh t nhng vin gch, gi l
nucleotide,vit tt l Nu. Do cc Nu chi khc nhau base (1Nu = 1
Desoxyribose + 1 phosphate + 1 base), nn tn gi ca Nu cng l tn ca base
m n mang. Ch c 4 loi gch c bn l A, T,
C, v G.
Mi base trn 1 chui ch c th bt cp vi 1
loi base nht nh trn chui kia theo mt quy
lut chung cho mi sinh vt. Theo quy lut,
mt "A" chui ca phn t ADN si kp s
ch lin kt ng vi mt "T" chui
kia.(Nguyn tc b sung). Mi chui xc nh
theo mt hng v hai chui ca mt DNA
lun hng ngc chiu nhau. Nh vy, i
din vi Nu th nht ca mt chui l Nu cui
cng ca chui kia, i din vi Nu th 2 ca
chui th nht l Nu st cui ca chui th hai,
. . . V d, nu chui th nht l AGC th chui
th 2 s l GCT.
Ton b DNA ca Steve c mt phng th
nghim tuyt mt ghi li, nhng Steve ch nhn
c bn in ca mt trong s 2 chui di
dng au S. T ti liu chuyn mn, Steve bit
c gen siu nhn l t. DNA ca ai cha t
nh mt xu con (cc k t lin tip nhau) s l
mt siu nhn! Tt nhin, Steve mun bit c
cha gen siu nhn hay khng. Lu l gen
siu nhn c th nm chui m Steve khng
46

Hnh 30

nhn c.
Yu cu: Cho S xu DNA di khng qu 200 k t v xu gen t di
khng qu 20 k t. Hy xc nh xem Steve c gen siu nhn hay khng v
a ra cu tr li di dng Yes hoc No.
D liu: Vo t file vn bn DNA.INP, dng th nht cha xu S, dng th 2
cha xu t.
Kt qu: a ra file vn bn DNA.OUT cu tr li Yes hoc No.
V d:
DNA.INP
ATGCATGC
TGC

DNA.OUT
Yes

Yu cu m rng: Gii thut thay i nh th no nu cc xu S v t c di


khng vt qu 106? Hy lp trnh cho trng hp m rng.

CNG C LP TRNH
Trang b kin thc v ngn ng lp trnh cha bao gi l mt vn ln trong
tin hc. iu quan trng l k thut lp trnh v t chc d liu. Khi bit
tng i tt mt ngn ng lp trnh th vic chuyn sang lp trnh mt ngn
ng mi kh n gin.
Bn cnh ngn ng truyn thng PASCAL vi h thng lp trnh Free Pascal v
C++ vi h thng lp trnh DEV C++, nhiu nc cn cho php v khuyn
khch s dng mt lot cc ngn ng khc nh Delphi, Python, Java, C#, . . .
ng nhin, khi chn mt ngn ng no lm cng c cho mnh ngi lp
trnh cn phi:
Bit r nhng im mnh v yu ca ngn ng cng nh ca h thng h
thng lp trnh h tr,
Cn nm vng cc dch v m h thng lp trnh cung cp,
Cn c thi quen suy ngh v hnh ng ph hp vi ngn ng v h
thng lp trnh,
Cn bit cng su cng tt cc th vin chun h tr lp trnh v bit
khai thc chng mt cch ti u.
47

Nu c cch tip cn hp l th nhng vn trn c th gii quyt c mt


cch kh n gin v hiu qu.
nc ta, trong bc PTTH h thng lp trnh c s dng ph bin l ngn
ng PASCAL vi h thng lp trnh Free Pascal. bc i hc, ngn ng lp
trnh ch yu l C/C++ vi h thng Dev C++.
Trn th gii nhiu nc s dng C++ vi cc h thng lp trnh Dev C++ hoc
tng ngngay t bc ph thng trung hc.
Vic ging dy i tr trong nh trng khng phi l vn tho lun y.
Nhng vic trang b cng c cho hc sinh nng khiu, phc v cho cc k thi
Tin hc l vn nm trong tm xem xt v x l ca chng ta.
Cng cn lu l trong mt tng lai gn ta s phi xem xt n cc kha cnh
ca vic t chc x l song song.
Cc bi ton tham kho
Di y l mt s bi ton thi quc gia hoc khu vc cc nm 2011 2012
ta hnh dung c mt bng yu cu chung ca th gii i vi hc sinh gii tin
hc:
Bi 1. MT KHU
Mi ngi tham d Olympic Tin hc u phi kch hot chng trnh cung cp
mt khu ring cho mnh truy nhp vo h thng. Khi c kch hot,
chng trnh s a ra 2 s nguyn ( h 10). S th hai nhn c t s th
nht bng cch thay dy khng rng cc ch s lin tip nhau bng tng ca
chng. Mt khu chnh l dy s to thnh tng ghi vo s th 2.
V d, 2 s m chng trnh cung cp l 2148 v 213, s th 2 nhn c t s
th nht sau khi thay 148 bng 1+4+8 (= 13). Nu nh s cc ch s trong s
th nht bt u t 1, t tri sang phi th mt khu c xc nh t dy cc
ch s t 2 n 4 ca s th nht.
Yu cu: Hy xc nh cc v tr u v cui ca dy s to nn mt khu.
D liu: Vo t file vn bn PASSWORD.INP, dng u tin cha s th nht,
dng tip theo cha s th hai. Cc s khng bt u bng 0 v mi s c
khng qu 105 ch s.

48

Kt qu: a ra file vn bn PASSWORD.OUT trn mt dng 2 s nguyn xc


nh cc v tr u v cui ca dy s to nn mt khu. Nu tn ti nhiu li
gii th a ra li gii ty chn bt k. D liu m bo c nghim.
V d:
PASSWORD.INP
2148
213

PASSWORD.OUT
2 4

Ghi ch: Bi d nht ca k thi Lin bang Nga 2012, gii thut ti u c
phc tp O(n).
Bi 2. KHM SC KHE
t khm tuyn ngha v qun s nm nay c n ngi c gi. Tt c h u
phi khm sc khe ln lt t phng 1 n phng m. Ti mi thi im mi
phng c th khm c ng thi k ngi.Mi ngi, khi khm xong phng
th i s chuyn sang xp hng khm phng i+1. Trnh t dch v mi
phng l ai n trc th khm trc. Thi gian chuyn t phng ny sang
phng khc v thi gian chuyn ngi khm trong mt phng l khng ng k.
Mi ngi c mt phiu khm sc khe, nh s theo th t vo khm phng
u. Mi phng ghi li thi gian khm dnh cho ngi c phiu.
Vi tp phiu ghi nhn thi gian khm hy xc nh khong thi gian t lc
ngi u tin vo khm phng 1n lc kt thc khm ngi cui cng
phng m.
D liu: Vo t file vn bn MEDCHECK.INP:
Dng u tin cha 3 s nguyn n, m v k (1 n 105,1 m, k 10),
Dng th i trong n dng sau cha m s nguyn xc nh thi gian khm
mi phng ca ngi th i, thi gian c gi tr trong khong [1, 1000].
Kt qu: a ra file vn bn MEDCHECK.OUT mt s nguyn khong thi
gian tnh c.
V d:
MEDCHECK.INP
3 2 2
3 5
4 4
5 3

MEDCHECK.OUT
11

49

Ghi ch: Kazastan 2012, O(n).


Bi 3. LI NHY
C rt nhiu siu anh hng nh Batman, Ngi Nhn, Siu nhn, . . . mt trong
s l anh chng Kickass. Bt chc Ngi Nhn anh ta t chc mt mn
trnh din nhy t nc nh ny sang
nc nh khc.
Kickass chn mt dy n nh cao tng,
nh s t 1 n n t tri qua phi v
bt u nhy t nc nh th k. Tuy
vy, do nng lc cn yu anh ta ch c
th nhy sang nc nh k cnh bn
2
8
1
10
3
9
4
1
10
7
phi hoc bn tri khng cao hn nh
Hnh 31
ang ng. Khng mun mi ngi
thy mnh yu km anh ta b tr mt
s li l xo trn mt vi nc nh. Vi s tr gip ca li l xo anh ta c th
t nh ti nc ngi nh bt k khng ph thuc vo n u v cao th no.
Hy xc nh s lng ti a cc nc nh m anh ta t chn n trong qu
trnh nhy. Cc nc nh m anh ta nhy qua nhy li nhiu ln ch c tnh l
mt. Nc nh xut pht cng c tnh k c khi khng c ln no nhy li ti
n.
D liu: Vo t file vn bn TRAMPO.INP:
Dng u tin cha 2 s nguyn n v k (3 n 2105, 1 k n),
Dng th 2 cha n s nguyn dng, mi s khng vt qu 109, xc
nh cao cc nh trong dy, t tri qua phi,
Dng th 3 cha xu S di n ch cha cc k t trong tp {., T}, Si =
T cho bit trn nc nh th i c t li nhy .
Kt qu: a ra file vn bn TRAMPO.OUT mt s nguyn s lng ti a
cc nc nh ti.

50

V d:
TRAMPO.INP

TRAMPO.OUT
7

10 1
10 7 3 1 1 9 8 2 4
10
..T..T....
Ghi ch: Croatia 2012, O(n).
Bi 4. BNH RN PH THY

V o s c vic i vo thnh ph v dn ch b gip vic lm bnh rn ti


n. o s rt thch bnh rn v mi ti n khng t hn mi chic. Ch b
gip vic khoan khoi thy thy i vng. Ngh ti lm bnh rn ch hi ngi,

Hnh 32
nhng cht nh ra cu thn ch nghe lm c v h to n. Lp tc dng
trong bp nhy ln, t thao tc v cho ra l ht chic bnh rn ny n chic
khc. Ch khoi ch h ln Thi, ri, dng li! nhng cc thit b vn tip
tc hot ng. Chic bn sp sp di sc nng ca ng bnh rn. Cung qu
ch qun mt cu thn ch dng vic, ch nh rng n c ghi trn chic vng
eo tay ca o s. Mt vng c ph li vung, trn mi c ghi
mt ch ci, t mi c th i sang 8 k cnh hoc nh (xem hnh v). T
mt ta c th i sang k. Cc ch ci trn nhng k i qua to thnh
mt xu k t. Cu thn ch cn tm l xu di nht (c di ln hn 1) xut
hin trn vng t nht 2 ln, ngoi ra tha mn cc iu kin:
Mi xu khng cha cc lp li ( i qua),
Hai xu phi bt u t 2 khc nhau hoc cng mt nhng theo hng
i khc nhau.
51

Theo nh ngha trn, xu palindrome d nhin l xut hin t nht 2 ln.


Hy xc nh cu thn ch cn tm.
D liu: Vo t file vn bn DONUT.INP gm nhiu tests, mi test cho trn
mt nhm dng, dng u tin cha 2 s nguyn h v w ( 3 h 10, 3 w
20), trong h v w s trn cc vng trn con v vng trn ln, tip theo l h
dng, mi dng cha xu gm cc ch ci la tinh in hoa di w xc nh
cackys t ghi trn mt vng trn ln, cc xu u bt u t ca mt vng
trn con.
D liu kt thc bng dng cha 2 s 0.
Kt qu: a ra file vn bn DONUT.OUT cu thn ch tm c, kt qu mi
test trn mt dng. Nu c nhiu xu cng tha mn th a ra xu c th t
t in nh nht. Nu khng tn ti xu tha mn th a ra mt s 0.
V d:
DONUT.INP
5 7
RRCABXT
AABMFAB
RROMJAC
APTADAB
YABADAO
3 13
ABCDEFGHIJKLM
XMADAMIMADAMY
ACEGIKMOQSUWY
3 4
DEFG
ACAB
HIJK
3 6
ABCDEF
GHIAKL
MNOPQR
10 19
JFZODYDXMZZPEYTRNCW
XVGHPOKEYNZTQFZJKOD
EYEHHQKHFZOVNRGOOLP
QFZOIHRQMGHPNISHXOC
DRGILJHSQEHHQLYTILL
NCSHQMKHTZZIHRPAUJA
NCCTINCLAUTFJHSZBVK
LPBAUJIUMBVQYKHTZCW
XMYHBVKUGNCWTLLAUID
EYNDCCWLEOODXYUMBVN
0 0
52

DONUT.OUT
ABRACADABRA
MADAMIMADAM
ABAC
0
ABCDEFGHIJKLMNOPQRSTUVWXYZHHHHHABCDEFGHIJKLMNOPQRSTUVWX
YZ

Ghi ch: Bi A, Fukuoka, Nht 2011.


Bi 5. PHN TCH FIBONACCI
Fibonacci l dy s f0 =0, f1 =1, f2 = 1, f3 = 2, . . ., fn = fn-1 + fn-2 vi n >2.
Cc s u tin ca dy s Fibonacci l 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, . . .
Steve kho st vic phn tch mt s nguyn thnh tng, hiu cc s Fibonacci.
Hin ti Steve tm hiu vic biu din mt s nguyn di dng tng/hiu mt
s t nht cc s Fibonacci (khng nht thit phi khc nhau). V d, cc s 10,
19, 17 v 1070 c th biu din vi s lng t nht l 2, 2, 3 v 4 s Fibonacci:

Vi mi s nguyn dng trong p s cho trc hy xc nh s lng ti thiu


cc s Fibonacci biu din s di dng tng i s (tc l bng cc php
cng, tr).
D liu: Vo t file vn bn ARSUM.INP:
Dng u tin cha s nguyn p (1 p 10),
Mi dng trong p dng sau cha s nguyn k (1 k 41017).
Kt qu: a ra file vn bn ARSUM.OUT kt qu tm c di dng s
nguyn, mi kt qu trn mt dng.

53

V d:
ARSUM.INP
1
1070

ARSUM.OUT
4

Ghi ch: Bi 2 vng 2 Ba Lan 2012 (Ba lan thi 4 vng).

54

CHUYN 2
TRAO I V MT S BI TP TRONG L THUYT S
2.1. S nguyn t.
2.1.1. V hai hm tm s nguyn t nu trang 19 v 20 (Ti liu GKCT, Q1):
a. Hm 1 (chn k=2) c chy chm hn hm 2 (chn k=6) hay
khng?.
Hm 1.
function snt(a: longint): boolean;
var i, sqrt_a: longint;
begin
if (a<2) then exit(false);
sqrt_a := trunc(sqrt(a));
i:=2;
while (i<=sqrt_a) do begin
if (a mod i =0) then exit(false) else
inc(i);
end;
exit(true);
end;
Hm 2.
function prime(a: longint): boolean;
var i, sqrt_a: longint;
begin
if ((a=2) or (a=3)) then exit(true);
if ((a<2) or (a mod 2=0) or (a mod 3=0)) then
exit(false);
sqrt_a := trunc(sqrt(a));
i:=5;
while (i<=sqrt_a) do begin
if ((a mod i = 0) or (a mod (i+2)=0)) then
exit(false) else
inc(i,6);
end;
exit(true);
end;
Khi chn k=2 th xc sut s phi xt khong l 1/2 (ch xt cc s l), chn
k=6 xc sut s phi chn khong l 1/3 (ch xt cc s 6k-1 v 6k+1). Khi dng
55

chng tm tt c cc s nguyn t khng vt qu N vi N nh th thi gian


chy khng chnh lch nhau ng k, nhng khi N ln, thi gian khc bit
nhiu. Nguyn nhn v sao? (Tham kho cc s liu sau v thi gian chy
chng trnh ng vi my c b nh 2G, b x l ADM Dual-Core (1,65GHz).
1N
1000 104
105
106
107
Thi gian chy chtrnh dng hm 1 0,005 0,015 0,203 4,695 117,75
(n v giy)
Thi gian chy ch trnh dng hm 2 0,005 0,015 0,078 1,623 39,07
(n v giy)
S lng s nguyn t khng vt qu 168 1229 9592 78498 664579
N
b. Trao i. ngha cc dng lnh sau y:
Trong hm 2:
if ((a<2) or (a mod 2=0) or (a mod 3=0)) then
exit(false);
v:
if ((a mod i = 0) or (a mod (i+2)=0)) then
exit(false) else
inc(i,6);
Trong hm 1:
if (a mod i =0) then exit(false) else
inc(i);
Trong cc vng lp ca hai chng trnh ti sao ch s i ch cn chy ti
sqrt_a?
2.1.2. Kim tra nhanh s nguyn t theo xc sut nh th no?
Da trn nh l Fecmat nh: Nu p l s nguyn t v a l s t nhin th ap
a (mod p).
Pht biu cch khc: Nu p l s nguyn t th vi mi s nguyn a tha mn 1
a<p th a p 1 1 (mod p).
Sau y l mt tnh cht ca php ton ng d, c dng khi gii quyt vn
1.2:

56

2y 2

y 2k
x

x y (mod N )
(mod (N) (*)
2y 2

y 2k 1
x x

a. Xy dng hm kim tra s nguyn t theo nh l Fecmat nh


var z, p, a : longint;
function lt(x,y,n: longint):longint;// Xy dng hm xy (mod
N) theo cng thc (*)
var z1 : longint;
begin
if y=0 then lt := 1
else begin
z := lt (x, y div 2, n);
if (y mod 2 = 0) then z1 := (z*z mod n)
else z1:= x*(z*z mod n);
if z1>n then z1:=z1 mod n;
lt := z1;
end;
end;
function nt(p : longint): boolean;
begin
nt := false;
for a:=1 to p-1 do
if lt(a,p-1,p)<>1 then exit;
if p<2 then nt:= false else
nt := true;
end;
begin
write('nhap so p : '); readln(p);
if nt(p) then write('Nguyen to ')
else write('Khong nguyen to');
readln;
end.
Lu . Tuy nhin chng trnh ny t c dng kim tra s nguyn t
v:
57

+ Chy chm (do nguyn nhn no?)


+ Khi p>45000 s trn s (do nguyn nhn no?)
Trong trng hp mun kim tra gn ng s p ln c l nguyn t hay
khng th cho a nhn mt gi tr ngu nhin random(p-2)+2. Gi s lng test l
ntest, gi xacsuat l xc sut ti thiu tha nhn p l nguyn t. Khi p l
s nguyn t nu (s ln cha khng nh c p l hp s)/ntest)> xacsuat. S
lng test l ntest cng ln th kh nng tha nhn ng p l nguyn t cng
chnh xc hn . Xc sut ti thiu xacsuat c th iu chnh tng tng
chnh xc.
b. Chng trnh kim tra gn ng s nguyn t theo nh l Fecmat nh
Chng trnh 1 (Kim tra s nguyn t theo xc sut
da trn nh l Fecmat nh) tng i nhanh, chnh
xc kh cao
uses sysutils;
const ntest = 30; // S lng test (c th iu chnh)
sacxuat=0.6;
// c th iu chnh
var p, count : int64;
start, stop : tdatetime;
function luythua(x,y,n: int64): int64;// Xy dng xy (mod n)
theo cng thc (*)
var z : int64;
begin
if y=0 then luythua := 1
else begin
z := luythua(x, y div 2,n);
z := (z*z) mod n;
if y mod 2 = 1 then z := ((x mod n) * z) mod n;
luythua := z;
end;
end;
function nt(p : int64): boolean;
var test,dem, a : longint;
begin
if p=2 then begin nt := true; exit; end;
nt := false;
if p<2 then exit;
randomize;
58

dem := 0;
for test:=1 to ntest do begin
a := random(p-2)+2;
if luythua(a,p-1,p)<>1 then exit
else inc(dem);
end;
if (dem/ntest>sacxuat) then nt := true else
nt:=false;
end;
BEGIN
start := now; count := 0; p:=1;
while p<=1000 do begin
if nt(p) then begin write(p:8); count:= count+1;
end;
p := p+1;
end;
writeln; writeln(count);
stop := now;
writeln('Thoi gian chay: ', (stopstart)*3600*24:0:5);
readln;
END.
2.1.3. Thut ton Miller-Rabin (cng da trn nh l Fecma nh)
tng ca thut ton l: Gi s c mnh Q(p,a) ng vi cc s nguyn t
p v mi s t nhin
. Cn kim tra s n c l s nguyn t hay
khng, thc hin php th xem Q(n, a) ng hay sai:
a) Nu Q(n,a) khng ng, th tt yu n l hp s.
b) Nu Q(n,a) ng, th s n c th l s nguyn t vi mt xc sut no .
Khi tng s ln th (s ln chn gi tr ngu nhin ca a), xc sut t b) suy
ra n l s nguyn t s tng ln.
Thut ton Miller-Rabin:
+ Nu n=2 th n l nguyn t. Kt thc
+ Nu n<2 hoc n chn th n l hp s. Kt thc.
+ Phn tch n-1: n-1= d.2s (d l s l)
+ Vng lp (vng ngoi) vi s ln chn thch hp {
+ Khi to mt s ngu nhin a thuc [1,n-1]
+ Tnh x= ad (mod n)
59

+ Nu x=1 hoc x=n-1 (ngha l x= 1 (mod n)) th quay v du vng lp


+ Trong khi s>=0 lp (vng trong) {
- Thay x=x2 (mod n)
- Nu x = n-1 th thot vng lp trong
- Gim s mt n v
}
+ Nu s<0 then n l hp s. Kt thc
}
+ N l nguyn t. Kt thc
Chng trnh 2 (Kim tra s nguyn t theo MillerRabin) Nhanh nht nhng chnh xc cn hn ch nn
chng trnh ny ch tham kho
uses sysutils;
const ntest = 2;
var n, d, s, count : int64;
start, stop : tdatetime;
procedure phantich(x: int64; var d, s : int64);
begin
s := 0; d:=1;
while (x mod 2 =0) do begin
x := x div 2;
inc(s);
end;
d := x;
end;
function luythua(x,y,n: int64): int64;// Xy dng cng thc
xy mod n theo cng thc (*)
var z : int64;
begin
z := 1;
while (y>0) do begin
if (y mod 2 =1) then z := (z*x) mod n;
y := y div 2;
x := (x*x) mod n;
end;
exit(z);
end;
function prime(n : int64): boolean;
60

var dem, r, a, x : int64; k: longint;


begin
if n=2 then exit(true);
if (n<2) or (n mod 2=0) then exit(false);
phantich(n-1,d,s);
randomize;
for k:=1 to s do begin
a := random(n-2)+2;
x := luythua(a,d,n);
if (x=1) or (x=n-1) then continue;
while s>=0 do begin
x:= luythua(x,2,n);
if x=n-1 then break;
dec(s);
end;
if s<0 then exit(false);
end;
exit(true);
end;
BEGIN
start := now;
n:= 2;
while n<=100 do begin
if prime(n) then begin write(n:8); inc(count);
end;
inc(n);
end;
writeln;
writeln(count);
stop := now;
writeln('Time: ',(stop-start)*3600*24:0:5);
readln;
END.
2.1.4. Sng Eratosthenes?
Thut ton sng Eratosthenes. Tm ton b cc s nguyn t khng vt
qu s nguyn dng N nh sau: Biu din cc s nguyn trn trc s bt u t
2 n N, sau xo dn cc im l bi ca 2, ri cc s l bi ca 3, , qu
61

trnh tip tc nh th vi cc bi ca i khi m i2 N. Cc s nguyn cn li cha


b xo s l s nguyn t.
Chng trnh 3 (Thun li khi cn mi s nguyn t
khng vt qu N)
uses sysutils;
const fo ='';
maxnum = 10000 ;
var n, count : int64;
test : longint;
g : text;
x : array [2..maxnum] of boolean;
start, stop : tdatetime;
procedure tao_x;
var i, j, canN : int64;
begin
i:=2;
while (i<=maxnum) do begin // Khi tr mng nh du x: cc
phn t cha xt (nhn gi tr false)
x[i] := false;
i := i+1;
end;
n := maxnum;
canN := trunc(sqrt(n));
i:= 2;
while i<=canN do begin
j := i+i;
while j<=n do begin
x[j] := true; // j l hp s v l bi ca i
j := j+i;
end;
i := i+1;
while x[i] do i := i+1; // B qua cc s i lin tip l hp s
gp s nguyn t mi
end;
end;
BEGIN
start := now;
62

tao_x;
assign(g, fo); rewrite(g);
n := 2; count := 0;
while n<=maxnum do begin
if not x[n] then begin inc(count); write(g,n,'
'); end;
n:= n+1;
end;
writeln(g); write(g,count,' ');
stop := now;
write((stop-start)*3600*24:0:5);
close(g);
END.
Trao i. V sao trong th tc tao_x , vng lp while i<=canN do
begin ch cho gi tr bin i chy n canN (cn bc hai ca N)?
2.1.5. Phn tch s nguyn thnh tch cc tha s nguyn t
Chng trnh 4
var n,i : longint;
begin
write('Nhap so nguyen duong n : ');readln(n);
i := 2;
while (n>1) do begin
while (n mod i=0) do begin
write(i,' ');
n := n div i;
end;
inc(i);
end;
readln;
end.
2.1.6. Biu din s nguyn
Chuyn biu din s nguyn dng t h c s c1 sang h c s mi c2.
Hn ch: (2 c1, c2 34)
Chng trnh 5 (Biu din s nguyn theo c s ty
chn)
uses
crt;
63

Const max
= 34;
H
:
String
=
'0123456789ABCDEFGHIKLMNOPQRSTUVXYZ';
Var
c1,c2,so : Longint;
n
: String;
function Cosomin(S:String):Byte;
var i : Byte; ch : Char;
begin
ch := '0';
for i:=1 to length(s) do
if s[i]>ch then ch := s[i];
cosomin:= pos(ch,H);
end;
procedure nhap;
var i : byte;
begin
repeat
write('Cho biet co so thu nhat ');
{$i-} readln(c1); {$i+}
until (Ioresult=0) and (c1>=1) and (c1<=Max);
repeat
write('Cho biet so N (duoi dang co so thu nhat ):
');
{$i-} readln(n);
{$i+}
for i:=1 to length(n) do n[i]:=Upcase(n[i]);
until
(ioresult=0)
and
(c1>=cosomin(n))
and
(c1<=max);;
repeat
write(#10#13'Cho biet co so moi : ');
{$i-} Readln(c2);
{$i+}
until (ioresult=0) and (c2>1) and (c2<=max);
end;
function doiC1_10(s:String):Longint;
var i
: Byte;
p
: Longint;
begin
p:=0;
for i:=1 to length(s) do
64

p:= p*c1+ Pos(s[i],h)-1;


doiC1_10:=p;
end;
function doi10_C2(n:Longint):String;
var p : String;
i : Byte;
begin
p:='';
while (n>0) do begin
p
:= H[n mod c2+1]+p;
n
:= n div c2;
end;
doi10_C2:=p;
end;
BEGIN
repeat
clrscr;
nhap;
so := DoiC1_10(n);
writeln(N,'[cs
',c1,']=',Doi10_C2(so),'[cs
',c2,']');
write(#10#13,'ESC : Thoat . Phim khac : tiep tuc
');
until Readkey=#27;
END.
2.1.7. Bi tp 1. Kim tra s nguyn t vi tc cao
Tm s nguyn t gn nht nh hn N (3 N 230). D liu vo: Dng u tin
cha s nguyn T l s lng test. (T 10000). T dng tip theo, mi dng cha
mt s nguyn N. Kt qu: Vi mi test, in kt qu trn mt dng. Hn ch thi
gian: 5 giy. V d:
D liu:
3
5
10
17
Kt qu:
3
65

7
13
d kin cch gii bi tp trn, chng ta c th tham kho kt qu chy
cc chng trnh tm cc s nguyn t khng vt qu N. Hy phc tho cc d
kin gii bi tp ny sao cho bo m hn ch thi gian nu trong . Bn chn
d kin no trong cc d kin sau y:
A. To sng Eratosthenes, lu vo mt mng cc s nguyn t t 2 n 2 32
, sau c tp input, vi mi s N tm c, tm trn mng lu tm s
nguyn t nh hn v gn N nht
B. c input, mi ln c mt s N, dng hm 1 hoc 2 kim tra pht
hin s nguyn t nh hn v gn N nht.
C. c input, mi ln c mt s N, dng chng trnh 1 kim tra pht
hin s nguyn t nh hn v gn N nht.
D. D kin khc.
Hy phn tch tng d kin c kh nng thc hin c hay khng?
2.2. c chung ln nht.
2.2.1. Thut ton Euclid
B . Nu a=bq+r (a, b 0, q v r l cc s nguyn) th: UCLN(a,
b)=UCLN(b, r).
Thut ton Euclid tm c chung ln nht. Lp thc hin b trn cho
n khi b=0.
Chng trnh 6 (Tm UCLN theo nh ngha)
uses crt;
var x, y : longint;
function gcd(a,b : longint): longint;
var r : longint;
begin
if a<0 then a:= -a;
if b<0 then b:= -b;
while b<>0 do begin
r := a mod b;
a := b;
b := r;
end;
gcd := a;
end;
66

begin
write('nhap hai so x va y : '); readln(x,y);
write('UCLN (',x,',',y,') = ',gcd(x,y));
readln;
end.
2.2.2. Thut ton Euclid m rng
nh l. Nu d=UCLN(a, b) th tn ti cp s nguyn x v y sao cho d=ax+by.
Thut ton Euclit m rng th hin qua th tc sau (gi m) tr v d, x v y:
Extended_Euclid(a,b) {
Nu b=0 th tr v (d=a, x=1, y=0). Dng
Gi qui Extended_Euclid(b, a mod b) tr v (d, x, y);
a
Gn (d, x, y) (d, y, x- y)
b

Tr v (d, x, y);
}
Th tc (thut ton Euclid m rng)
procedure ext_Euclid(a: longint;b:
longint;
var x,y: longint);

longint;

var

d:

var d1,x1,y1 : longint;


begin
if b=0 then begin
d := a; x := 1; y := 0;
end
else begin
ext_Euclid(b, a mod b, d1, x1, y1);
d := d1;
x := y1;
y:= x1-(a div b)*y1;
end;
end;
2.2.3. Hm -le
Hm -le
cho s lng cc s nguyn t 1 n n nguyn t cng nhau vi
n. Ni cch khc l s lng cc s nguyn trong on [1;n] c UCLN vi n
bng 1.
Mt vi gi tr ban u: (1) =1, (2) =1, (3) =2, (4) =2, (5) =4,
67

Ba tnh cht n gin ca hm -le sau y cho php tnh c gi tr ca hm.


( p) =p-1 vi p l s nguyn t
( p a ) = p a p a 1 vi p l s nguyn t v a l s nguyn.
(a.b) (a). (b)
T xy dng c cch tnh hm -le (n) nh sau:
Phn tch n thnh dng tch cc tha s nguyn t. n p1a . p2a ... pka . (pi
nguyn t, i=1, 2,..k)
(n) ( p1a ). ( p2a )... ( pka ) = p1a p1a 1 . p2a p2a 1 ... pka pka 1 .
1

Do (n) n 1

1
1
1
. 1 ... 1
p1
p2
pk

Chng trnh tnh Hm le


uses crt;
var n, i : longint;
function ole(n : longint): longint;
var result, i : longint;
begin
result := n;
i := 2;
while (i*i<n) do begin
if (n mod i=0) then begin
while (n mod i=0) do n := n div i;
result := result-(result div i);
end;
inc(i);
end;
if n>1 then result := result-(result div i);
ole := result;
end;
BEGIN
write('Nhap n: '); readln(n);
write(ole(n));
readln;
END.
Tnh cht quan trng nht ca hm -le th hin qua nh l -le:
nh l -le. a ( m) 1 (mod m) vi a v m nguyn t cng nhau.
V mt trng hp c bit ca nh l l nh l Fecma nh (nu trn):
a p 1 1 (mod p).
68

2.2.4. Mt s khi nim v ng d


Php ton ng d. D ca php chia s nguyn cho N c N gi tr l 0,
1, 2, , N-1. Hai s nguyn x v y c cng mt s d khi chia cho N c gi
l hai s nguyn ng d, k hiu: x y (mod N).
Hai s nguyn x v y c gi l ng d theo mun N nu (x-y) chia ht
cho N.
Cc s nguyn c cng s d khi chia cho N to thnh mt lp ng d.
Tp hp cc lp ng d theo N k hiu l Zn. V d c 3 lp ng d theo
mun N=3 l:
-9, -6, -3, 0, 3, 6, 9,
-8, -5, -2, 1, 4, 7, 10,
-7, -4, -1, 2, 5, 8, 11,
Mt s tnh cht

x x ' (mod N) v y y ' (mod N) th x y x ' y ' (mod N) v xy x ' y '

(mod N)

x y z x ( y z) ( x y) z (mod N)

xy yx

(mod N)

x( y z) xy xz (mod N)
S i ca x theo mun N l N-x
S nghich o ca x theo mun N l s y sao cho x.y 1 (mod N).
nh l c bn ca ng d: x, y, nN , n0 v k hiu l mt trong 3
php ton: +, -, * th: (xy) mod n = ((x mod n) (y mod n)) mod n.
H qu. xy mod n = (x mod n)y mod n (p dng khi x>n).
2.2.5. Gii phng trnh ng d tuyn tnh (i--phng): ax b (mod n).
Cho phng trnh ax b (mod n), vi a, b, n l cc s t nhin, n>0. Cch
gii l:
a) Tm d l UCLN (a,n).
b) Nu d khng l c ca b th phng trnh v nghim.
c) Nu b = kd th phng trnh c ng d nghim trong tp Z n. Gi s x l
mt nghim ty (c th chn bng b. a sai khc mt s ln nguyn n/d, vi a
l nghich o ca a theo mod n), th d nghim ca phng trnh c dng x i
(mod n). , i = 0, 1, 2, ..., (d-1).
V d. Gii phng trnh ng d 14x 30 (mod 100).
69

n
d

Ta c a=14; b = 30; n = 100;


d l UCLN ca a v n nn d=(14, 100)=2, d l c ca b v 30 chia ht cho
2, nn phng trnh c 2 nghim trong Zn. Hai nghim ny l x1=-105 v
x2=x1+100/2=x1+50=-55.
Chng trnh 7 (Gii phng trnh i--phng)
uses
crt;
var
a, b, n, d, x, y : longint;
procedure extended_euclit (a, b : longint; var d, x,
y : longint);
var d1, x1, y1 : longint;
begin
if (b=0) then begin
d := a; x := 1; y := 0;
end else begin
extended_euclit(b, a mod b, d1, x1, y1);
d := d1;
x := y1;
y := x1 - (a div b)*y1;
end;
end;
procedure solution(a,b,n : longint);
var i : longint;
begin
extended_euclit(a,n,d,x,y);
if (b mod d=0) then begin
x := x*(b div d);
if x<0 then
while (x<0) do x := x + n div d
else
if (x>0) then
while (x>0) do x := x - n div d;
if x<0 then x := x + n div d;
writeln('Cac nghiem la: ');
for i:=0 to d-1 do writeln('x',i,' = ',x + i * (
n div d));
end else writeln('vo nghiem');
end;
BEGIN
70

Writeln('Giai phuong trinh Di o phang ax=b (mod n)


:');
write('Nhap a, b, n: '); readln(a, b, n);
solution(a, b, n);
readln;
END.
Trao i. Thut ton gii phng trnh ng d c thc hin bi chng
trnh 7.
2.2.6. Bi tp 2. Hn Tn im qun
Tc truyn rng ngy xa Hn Tn danh tng ca Lu Bang (Hn Cao
T) im binh cho lnh xp hng ba, hng nm, hng by ri ghi cc s l tng
ng s suy ra s lnh bng cch sau y: Nhn s l hng ba vi 70, s l hng
nm vi 21, nhn s l hng by vi 15. Cng cc kt qu y li ri thm mt
bi s thch hp ca 105 s c s lnh. Nu k hiu s lnh l S, s l xp
hng 3, hng 5, hng 7 tng ng l a, b, c th S = (70.a + 21.b + 15.c) + 105.k
(k l s nguyn chn thch hp S ph hp l s lnh ca mt i i, mt tiu
on hay trung on... ).
y cng l bi ton xut bi nh ton hc Trung quc Sun-Tsu.
C s ton hc ca cch im binh nu trn l nh l sau:
nh l. Cho m1, m2, , mn l cc s nguyn i mt nguyn t cng
nhau. H phng trnh:
x a1

x a2
(I)
...
x a
n

mod m1
mod m2
mod mn

C mt nghim duy nht l x

a M y (mod m)
i

i 1

vi m= m1.m2mn v Mi=

m
, yi l nghch o ca Mi theo mun mi :
mi

yi.Mi 1 (mod mi)


V d. Tm nghim ca h phng trnh ng d sau:
x 2

x 3

x 2

mod 3
mod 5 vi x [300; 400]
mod 7

m=3 5 7, M1=35, M2=21, M3=15,


71

y1=2 v 35 2 1(mod 3), y2=1 v 21 1 1(mod 5), y3=1 v 15 1 1(mod 7).


Vy nghim ca h theo mun m=105 l :
x= 2 35 2 + 3 21 1 + 2 15 1 = 233 23 (mod 105).
x [300; 400] nn x=338
Yu cu. Hy vit chng trnh nhp vo cc s a1, a2, ..., an, m1, m2, ...,
mn, c , d v gii h (I) trn tp [c; d].
Input. Dng u l s N (s phng trnh thuc h)
N dng tip theo ln lt l N s ai
N dng tip theo ln lt l N s mi
Dng cui cng l hai s c v d.
Output. Hin trn mn hnh nghim duy nht ca h (nu c) hoc thng
bo vo nghiem trong trng hp v nghim.
Trao i.
1. Cch tm s nghch o ca s a theo mun n?
2. V sao h (I) c nghim duy nht l: x

a M y (mod m)?
i 1

2.3. S nguyn ln
2.3.1. Xy dng cc php ton cng, tr v nhn
Bi ton. Dng mng mt chiu, xy dng cc hm cng, tr, nhn hai s
nguyn c hng nghn ch s.
Chng trnh 8 (Cng, tr, nhn hai s nguyn ln)
const
fi
= 'bignum.in';
fo
= 'bignum.out';
type
arr
= array[1..2000] of byte;
bignum = record
v : arr; // Mng cha cc ch s ca s
l : integer; // di ca s
end;
var a, b, c
: bignum;
f, g
: text;
function daomang(x : bignum): bignum;// o ngc biu din
s hng n v v tri nht
var i, j, t : integer;
z : bignum;
begin
z := x;
72

i:= 1; j := z.l;
while i<j do begin
t := z.v[i];
z.v[i] := z.v[j];
z.v[j] := t;
inc(i); dec(j);
end;
daomang := z;
end;
procedure hien(x : bignum); // Ghi s ln x vo tp output
var i : integer;
begin
for i:=1 to x.l do write(g,x.v[i]);
writeln(g);
end;
procedure read_input; // c hai s ln a v b t tp input
var i, j, l1, l2 : integer; ch : char;
begin
assign(f,fi); reset(f);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
readln(f,l1, l2); // di s a v s b
a.l := l1;
b.l := l2;
for i:=1 to l1 do begin
read(f,ch);
a.v[i] := ord(ch)-48;
end;
readln(f);
for i:=1 to l2 do begin
read(f,ch); b.v[i] := ord(ch)-48;
end;
close(f);
end;
function add(x,y : bignum): bignum; // Cng hai s ln x v y
var sum, carry, l, i : integer; z : bignum;
begin
x := daomang(x);
73

y := daomang(y);
fillchar(z,sizeof(z),0);
l := x.l;
if y.l>l then l:= y.l;
carry :=0;
for i:=1 to l do begin
sum := x.v[i] + y.v[i] + carry;
z.v[i] := sum mod 10;
carry := sum div 10;
end;
if carry>0 then begin
inc(l);
z.v[l] := carry;
z.l
:= l;
end
else z.l := l;
z := daomang(z);
add := z;
end;
function sub(x,y: bignum): bignum; // Tr hai s ln x v y,
ch x>y
var sum, carry, l, i : integer; z : bignum;
begin
x := daomang(x);
y := daomang(y);
fillchar(z,sizeof(z),0);
l := x.l;
carry :=0;
for i:=1 to l do begin
sum := x.v[i] - (y.v[i] + carry);
if sum<0 then begin
sum := sum + 10;
carry := 1;
end
else carry := 0;
z.v[i] := sum mod 10;
end;
while z.v[l]=0 do dec(l);
74

z.l := l;
z := daomang(z);
sub := z;
end;
function mult1(x: bignum; y : integer): bignum;
// Nhn s ln x vi s nguyn y
var sum, carry, l, i : integer; z : bignum;
begin
x := daomang(x);
fillchar(z,sizeof(z),0);
l := x.l;
carry :=0;
for i:=1 to l do begin
sum := x.v[i]*y + carry;
z.v[i] := sum mod 10;
carry := sum div 10;
end;
if carry>0 then begin
inc(l);
z.v[l] := carry;
z.l
:= l;
end
else z.l := l;
z := daomang(z);
mult1 := z;
end;
function mult(x, y: bignum): bignum; // Nhn hai s ln x v y
var l, i, j, lech : integer; z, z1 : bignum;
begin
fillchar(z,sizeof(z),0);
fillchar(z1,sizeof(z1),0);
l := y.l;
z := mult1(x,y.v[l]);
lech := 0;
for i:=l-1 downto 1 do begin
z1 := mult1(x,y.v[i]);
inc(lech);
for j:= 1 to lech do z1 := mult1(z1,10);
75

z
:= add(z,z1);
end;
mult := z;
end;
BEGIN
assign(g,fo); rewrite(g);
read_input;
hien(a); hien(b);
c:=MULT(a,b); // C th thay bng add(a,b) ( hoc sub(a,b) vi a>b)
hien(c);
close(g);
END.
2.3.2. Bi tp 3. Tnh 5000!
c s N t tp 5000GT.IN. Ghi kt qu 5000! ra tp 5000GT.OUT.
Gi . 5000! c 16326 ch s. V vy dng mng A mt chiu kch thc
khong 17000 phn t cha kt qu. thun tin khi nhn, ch s hng n v
ca kt qu c cha vo phn t cui cng (v tr last) ca mng. Ch s
hng cao nht (bn tri nht) ca kt qu v tr do bin first ch vo. Mi ln
nhn (k-1)! vi k c k! ta thc hin nh sau:
em k nhn ln lt vi cc ch s c trong mng A, theo th t t cui
cng tr v firrt-5. Ch s hng n v ca tch c thay cho gi tr c ca ,
phn cn li ca tch th lu vo bin carry mang sang gp vi tch ca k
nhn vi tip theo.
Mi ln nhn thm mt tha s, bin first li li v tri nhiu nht l 5
phn t v gi tr ln nht ca cc tha s l 5000, gi tr ln nht ca ch s
tri nht l 9 nn ch thm nhiu lm l 5 bn tri na sau mi ln nhn.

2.3.3. Bi tp 4. S Catalan
Xt tch n s M1, M2, , Mn l s M=M1.M2.Mn. S cch chn cp
ngoc n vo tch ny c cc cch biu din khc nhau ca M gi l s
Catalan. Nu coi s Catalan th nht ng vi n=1, th s Catalan th n c tnh
76

theo cng thc truy hi l T (n) T (i).T (n i) (*). Hy vit chng trnh tnh s
i 1

Catalan th n. Hn ch n 200. (Khi n=200, s Catalan c 117 ch s).


Gi .
Cch 1. S dng qui hoch ng, xy dng mng mt chiu T(N) tnh
cc s Catalan t s th nht dn v s th N theo cng thc truy hi (*). Thc
hin php nhn v cng s ln.
Cch 2. Nu coi s Catalan th nht ng vi n=0 th T[0]=1, T[1]=1,
T[2]=2, T[3]=5, T[4]=14, Trong trng hp ny c th s dng cng
thc:
T ( n)

2n ! n 2 n 3 ... (2n) , cn thc hin php chia


1
C2nn
n 1
1 2... n
n 1! n!

s ln
2.3.4. Bi tp 5. Tnh s bng Young
Bng Young chun l bng cha mt hon v ca {1, 2, , n}, mi
cha mt s, m dy s trn mi dng v trn mi ct l khng gim. V d vi
n=3 c 4 bng Young chun l:
1 2 3
1 2
1 3
1
3
2
2
3
Thut ton Bumping xy dng bng Young chun nh sau:
To cc hon v ca {1, 2, , n}. Vi mi hon v to ra, gi s l {p 1, p2,
, pn} ta xy dng bng Young (nu c) bng cch: chn ln lt cc pi vo
bng. Bt u vi p1 a vo dng 1, ct 1 (dng trn cng, ct bn tri nht).
Gi s xy dng xong t p1 n pk, by gi cn chn pk+1 vo bng ta lm nh
sau: vi dng th nht, tm phn t u tin trn dng ny ln hn p k+1. Nu
khng c th thm pk+1 vo dng ny. Ngc li gi s c pp ln hn pk+1 th
thay pp bi pk+1, ri li dng pp xt tm v tr chn n vo dng th hai, tip
tc xy dng bng cao dn. Nu khng xp c ht n p n th dng, chuyn
sang hon v tip theo to bng khc.
Cng thc truy hi tnh s lng bng Young chun to bi {1, 2, , n}
l: U(1)=1, U2=2; U(n)=U(n-1)+(n-1).U(n-2)
Lu . C th s dng mng lu tr cc s nguyn t gii.
Bi ton. Xt M s t nhin n1, n2, , nm vi n1 n2 nm>0. Chng ta
xc nh bng Young cha n1+n2++nm s t nhin: 1, 2, , n1+n2++nm, sao
cho dng th i c ni phn t (1 i m) sp tng theo th t t tri qua phi, v
77

cc phn t cng ct cng c sp tng t y ti nh (t dng 1 n dng


m).
V d bng Young vi m=4, n1=6, n2=4, n3=4, n4=1 nh hnh sau:
1

13

12

14

10

15

11
Nhim v: Cho n1, n2, , nm tm s lng cc bng Young cha cc s 1,
2, , n1+n2++nm.
D liu vo. File input l YOUNG.IN c cu trc: Trn dng th nht l
s t nhin m; trn dng th hai l: cc s n1, n2, , nm cch nhau du cch.
Kt qu ra. File output l YOUNG.OUT cha s bng Young tm c.
Hn ch: 1 m 20 ; ni 12 (1 i m). V d:
YOUNG.IN YOUNG.OUT
2
5
3 2
Minh ho 5 bng Young tm c:
1 3 5
1 2
2 4
4 5
1
2

3
5

1
3

2
4

1
3

2
5

Gi .
Bi ton ca chng ta l tm s bng Young theo khun dng cho trc
(mi dng i ch c mt s lng nht nh l ni) nn khc
bi ton tm s bng Young chun.
Ngi ta chng minh c rng: S bng Young theo
khun dng c th tnh bng n! chia cho tch cc di ci
mc ca cc . di ci mc ca mi l s lng cc
trn ci mc (bng tng ca 1 vi s lng bn phi v
pha di ca ). Hnh bn minh ha ci mc ca (2,3) gm 6 mu en
(nn mc ny di l 6).
2.4. Mt s bi tp khc

78

2.4.1. Bi tp 6. Nhn nhanh a thc.


Cho hai a thc c n s

hng p( x) p0 p1 x ... pn1 xn1

q( x) q0 q1 x ... qn1 x n1 . Thc hin nhn hai a thc ny bng thut ton chia

tr vi thi gian nhanh nh sau:


n
2

Chia a thc p(x) thnh hai a thc: p( x) pl ( x) x . ph ( x) vi


pl ( x) p0 p1 x ... p n x
2

n
1
2

v ph ( x) pn pn x ... pn1 x
2

n
1
2

n
2

Tng t chia a thc q(x) thnh hai a thc: q( x) ql ( x) x .qh ( x)


ql ( x) q0 q1 x ... q n x
2

n
1
2

v qh ( x) qn qn x ... qn1 x 2
2

n
2

Khi : p( x).q( x) pl ( x)ql ( x) pl ( x)qh ( x) ph ( x)ql ( x) x ph ( x).qh ( x).x n


t: rl ( x) pl ( x)ql ( x) , rh ( x) ph ( x)qh ( x) v rm ( x) pl ( x) ph ( x).ql ( x) qh ( x)
th:
n

p( x).q( x) rl ( x) rm ( x) rl ( x) rh ( x) .x 2 rh ( x).x n .

2.4.2. Bi tp 7. (Clocks IOI-1994).


a) Gii h phng trnh tuyn tnh bng phng php kh Gausse
x 3 y 4 z 8 (1)
V d. Gii h phng trnh: x y 2 z 2
(2) c ma trn A=
x 2 y 5 z 1 (3)

1 3 4

1 1 2
1 2 5

Bng phng php cng i s Gauss kh dn cc h s nm pha di


ng cho chnh ca ma trn A. C th: kh cc h s ca x1 hai phng
trnh (2) v (3) thnh 0 bng cch thay (2) bi (2)=(1)-(2) v thay (3) bi
(3)=(1)+(3). Tip theo kh h s ca x2 phng trnh (3) thnh 0 bng cch
thay (3) bi (3)=(2)-2 (3). Cui cng a v dng:
1x 3 y 4 z 8

0 x 2 y 2 z 6
0 x 0 y 4 z 8

Sau t phng trnh cui tm ra z, ngc ln cc phng trnh trn, tm


dn ra y, ri x.
79

b) Bi ton. C 9 ng h l A, B, , I trong mng 3 3 (Hnh 1). Nhim


v l quay mt tt c ng h v 12 gi vi cc php quay hp l. C 9 php
quay hp l, mi php gi l mt php di chuyn. Cc php di chuyn c
nh s t 1 n 9, chng s quay nhng mt ng h no mt gc 90 0 theo
chiu kim ng h c cho nh sau:
Php 1
ABDE
Php 2
ABC
Php 3
BCEF
Php 4
ADG
Php 5
BDEFH
Php 6
CFI
Php 7
DEGH
Php 8
GHI
Hnh 1. V 9 ng h
Php 9
EFHI
D liu. c 9 s t tp INPUT.TXT. Cc s ny cho v tr ban u ca
cc mt ng h vi qui c: 0 l 12 gi, 1 l 3 gi, 2 l 6 gi, 3 l 9 gi. V d
vi hnh v 1 th tp input c ni dung l:
330
222
212
Kt qu. Ghi vo tp OUTPUT.TXT dy ngn nht cc php di chuyn
(cc s) quay tt c cc mt ng h v 12 gi. Trong trng hp c nhiu
li gii, ch cn ghi mt li gii. Trong v d nu hnh 1, tp OUTPUT.TXT
c th l:
5849
Minh ho:
3 3 0
3 0 0
3 0 0
0 0 0
0
0 0
2 2 2 5-> 3 3 3
8-> 3 3 3
4 -> 0 3 3
9-> 0
0 0
2 1 2
2 2 2
3 3 3
0 3 3
0
0 0
Gi . C th m t tc ng ca cc php chuyn ti cc ng h trong
bng 1:
80

Nhn thy ng h
A ch b tc ng
bi t1 php di
chuyn 1, t2 php
di chuyn 2 v t4
php di chuyn 4.
ng h B ch b
tc ng bi t1
php di chuyn 1,
Bng 2
Bng 1
t2 php di chuyn
2, t3 php di chuyn 3 v t5 php di chuyn 5. ...
Do t bng 1 c th xy dng bng 2.
K hiu trng thi ca ng h V trc khi thc hin dy di chuyn l v v
sau khi thc hin l v. Trng thi mi v trng thi c quan h vi nhau theo
cc ng thc sau (cng theo mod 4) y vect (a, b, , i) l trng thi cho
ban u, cn vect (a, b, , i) l (0, 0, , 0):
a' = a + t1 + t2 + t4
b' = b + t1 + t2 + t3 + t5
c' = c + t2 + t3 + t6
d' = d + t1 + t4 + t5 + t7
e' = e + t1 + t3 + t5 + t7 + t9
f' = f + t3 + t5 + t6 + t9
g' = g + t4 + t7 + t8
h' = h + t5 + t7 + t8 + t9
i' = i + t6 + t8 + t9
Da vo tp input cho trng thi ban u ca cc ng h c th tnh ct h
s t do, v d vi hnh v trong bi c h (theo mod 4):
t1 + t2 + t4
=1
t1 + t2 + t3 + t5
=1
t2 + t3 + t6
=0
t1 + t4 + t5 + t7
=2
t1 + t3 + t5 + t7 + t9 = 2
t3 + t5 + t6 + t9
=2
t4 + t7 + t8
=2
t5 + t7 + t8 + t9
=3
81

t6 + t8 + t9
=2
H phng trnh trn c ma trn cc h s ca cc n c th to sn trong
tp matrix.dat v n khng ph thuc D liu vo.
110100000
111010000
011001000
100110100
101010101
001011001
000100110
000010111
000001011
Ring ct h s t do, phi suy ra t trng thi ban u ca cc mt ng
h ly t input.txt.
Do bi ton c th gii bng thut ton kh ca Gauss Jordan tm
nghim ca h phng trnh tuyn tnh (theo mod 4). Cch gii ny kh nhanh
nhngcn thn trng khi gp h suy bin.
2.4.3. Bi tp 8. Dng thp phn ca phn s
Nhp t bn phm 2 s nguyn dng P v Q. Hin trn mn hnh dng
thp phn (hu hn hoc v hn tun hon) ca phn s

P
. Kt qu hin theo
Q

dng cho ct 3 ca bng cho trong v d di y:


V d
P
Q
Kt qu trn mn hnh l
11113 72 154.347(2)
32567 125 260.536
367
12 30.58(3)
67
737 0.(09)
5
7
0.(714285)
100
5
20

2.4.4. Bi tp 9. Xp tng trn bn c (Little Bishops).


Trong c vua, qun tng ch c th di chuyn theo
ng cho v hai qun tng c th chiu nhau nu
82

chng nm trn ng di chuyn ca nhau. Trong hnh sau, hnh vung t m


th hin cc v tr m qun tng B1 c th i ti c, qun tng B1 v B2
chiu nhau, qun B1 v B3 khng chiu nhau.
Bi ton t ra l: Cho kch thc N ca bn c v K qun tng, hi c
bao nhiu cch t cc qun tng vo bn c m cc qun tng khng chiu
nhau.
D liu vo trong file: bishops.in c dng:
Dng u l s t l s test.
t dng sau mi dng cha 2 s nguyn dng N, K (1<=N<=8)
Kt qu ra file: bishops.out gm t dng, mi cha mt s duy nht l s
cch t cc qun tng vo bn c tng ng vi D liu vo.
Bishops.in Bishops.out
2
260
4 4
5599888
8 6
Gi .
Dng yu cu 1. Chia cc ng cho thnh hai loi: (x,y) thuc ng
cho c s hiu l x+y, v cng thuc ng cho c s hiu l x-y. Mi loi
ng cho s cha y cc bn c. Xy dng th tc quy
duyet(i,x,y) t tng i (i k) vo (x,y) (ct y tng dn t 1 n n, dng
x tng dn t 1 n n).
Dng yu cu 2. Ch tnh s cch t, khng quan tm n v tr t c th.
Trong hai loi ng cho cng ch quan tm n mt loi. Gi s ch quan tm
ti loi ng cho x+y c s hiu t 2 n 2.n (gm 2n-1 ng cho) Trong
2n-1 ng cho ny li chia thnh hai loi mu: ng cho en v ng
cho trng. Xy dng hm qui count(i, white, black) cho s cch
xp khi xt n ng cho th i v xp c white tng trn cc ng
cho trng v black tng trn cc ng cho en.
2.5. Tr li, hng dn
Bi tp 1. Kim tra s nguyn t vi tc cao
a) Chng trnh gii bi tp 1
uses sysutils;
const
fi ='sont.txt';
fo ='sont.out';
ntest = 30;
83

var z, p, a : int64;
start, stop : tdatetime;
f,g : text;
test : longint;
function luythua(x,y,n: int64): int64;// xy (mod N)
begin
if y=0 then luythua := 1
else begin
z := luythua(x, y div 2,n);
z := (z*z) mod n;
if y mod 2 = 1 then z := ((x mod n) * z) mod n;
luythua := z;
end;
end;
function nt(p : int64): boolean;
var test,dem : longint;
begin
if p=2 then begin nt := true; exit; end;
nt := false;
if p<2 then exit;
randomize;
dem := 0;
for test:=1 to ntest do begin
a := random(p-2)+2;
if luythua(a,p-1,p)<>1 then exit
else inc(dem);
end;
if (dem>ntest div 2) then nt := true else
nt:=false;
end;
procedure find(m : int64; var p: int64);
begin
m := m-1;
while (NOT nt(m)) and (m>0) do m:= m-1;
p := m;
end;
var m : int64;
BEGIN
84

start := now;
assign(f, fi); reset(f);
assign(g, fo); rewrite(g);
readln(f, test);
while test>0 do begin
readln(f,m);
test :=test-1;
find(m, p);
writeln(g,p);
end;
close(g);
close(f);
stop := now;
writeln('Thoi gian chay: ', (stopstart)*3600*24:0:5);
END.
b) Trao i.
Gii thch thut ton gii phng trnh ng d c thc hin bi chng trnh
7.
Xt ax b (mod n) : Gi s a v n nguyn t cng nhau, n>1 v tn ti
nghch o ca a theo mun n l a (ngha l a.a 1 (mod n)), do nhn
hai v ca ax b (mod n) vi a s c x b a (mod n) l nghim.
Trng hp tng qut: UCLN(a, n) =d th d=x.a+n.y do :
a
d

b=x. b+y.b

n
(*). Nu b khng chia ht cho d th v tri khng nguyn, v
d

phi nguyn (v l), suy ra phng trnh v nghim. Nu b chia ht cho d th t


b
d

(*) suy ra: (x )a b (mod n). Vy x

b
l mt nghim. Cc nghim khc chnh
d

n
d

lch vi nghim ny l i. , vi i=0, 1, d-1.


Bi tp 2. Hn Tn im qun
a) Chng trnh
uses
crt;
const
maxn = 10;
fi
= 'heptdd.txt';
var
a, m, yy, mm : array[1..maxn] of int64;
n, c, d, nghiem : int64;
f : text;
85

procedure extended_euclit (a, b : int64; var d, x, y


: int64);
var d1, x1, y1 : int64;
begin
if (b=0) then begin
d := a; x := 1; y := 0;
end else begin
extended_euclit(b, a mod b, d1, x1, y1);
d := d1;
x := y1;
y := x1 - (a div b)*y1;
end;
end;
function nghichdao(a, b : int64): int64;
var d, x, y : int64;
begin
extended_euclit(a,b,d,x,y);
nghichdao := x;
end;
procedure solution;
var i : longint; pm : int64;
begin
pm := m[1];
for i:=2 to n do pm := pm * m[i];
for i:=1 to n do mm[i] := pm div m[i];
for i:=1 to n do yy[i] := nghichdao(mm[i], m[i]);
nghiem := a[1]*mm[1]*yy[1];
for i:=2 to n do nghiem := nghiem +
a[i]*mm[i]*yy[i];
nghiem := nghiem mod pm;
while nghiem<c do nghiem := nghiem + pm;
if nghiem>d then write('Vo nghiem') else
writeln(nghiem);
end;
var i : longint;
BEGIN
writeln('Giai bai toan "Han Tin diem quan" :');
assign(f,fi); reset(f);
86

readln(f,n);
for i:=1 to n do readln(f,a[i]);
for i:=1 to n do readln(f,m[i]);
readln(f,c,d);
close(f);
solution;
readln;
END.
b) Trao i.
1. Tm nghch o ca a theo mod n: gii phng trnh: a.b 1 (mod m) s
tm c b l nghch o ca a theo mod n, k hiu l a -1.
Theo thut ton -clit m rng, d=UCLN(a,m) th a.x+m.y=d (1), xt hai
trng hp:
Nu d=1 th r rng (x +m) mod m chnh l a-1
Nu d 1 th t (1) a khng c nghch o.
2. Thut ton gii h phng trnh ng d
x a1

x a2
H (I)
...
x a
n

mod m1
mod m2

vi mi i mt nguyn t cng nhau.

mod mn

C mt nghim duy nht l x

a M y (mod m). Tht vy:


i 1

Chng minh x= ai M i yi l mt nghim: Nhn thy x c cc s hng


i 1

ak M k yk chia ht cho mi khi k i nn x ai M i yi (mod mi). Nhng M i yi 1

(mod mi) suy ra x ai (mod mi) vi mi i=1, 2, , n. Vy x l nghim


ca (I).
Nghim duy nht: Nu c x v y l hai nghim ca h th: x-y 0 (mod
mi) vi mi i=1, 2,...n suy ra x-y 0 (mod m) vi m=m1.m2...mn. Ngha
l x y (mod m)
Bi tp 3 (Tnh 5000!)
Chng trnh
const fi
= '5000gt.in';
fo
= '5000gt.out';
last = 17000;
var
a
: array[1..last] of integer;
87

n, first
: longint;
f, g
: text;
procedure read_input;
begin
assign(f,fi); reset(f);
read(f,n);
close(f);
end;
procedure calculate;
var carry,s,i,j : longint;
begin
if n>1000 then writeln('Please wait ... ');
for i:=1 to last-1 do a[i]:=0;
a[last] := 1;
first
:= last-1;
carry := 0;
for i:=1 to n do begin
for j:=last downto first-8 do begin
if a[j]<>0 then begin
s
:= a[j]*i + carry;
carry
:= s div 10;
a[j]
:= s mod 10;
end
else begin
a[j] := carry mod 10;
carry := carry div 10;
end;
end;
first := first-8;
repeat
inc(first);
until a[first]<>0;
end;
end;
procedure write_out;
var j,i : longint;
begin
j := 0;
88

assign(g,fo); rewrite(g);
writeln(g,first);
for i:=first to last do begin
write(g,a[i]); inc(j);
if j mod 75 = 0 then writeln(g);
end;
close(g);
end;
BEGIN
read_input;
calculate;
write_out;
END.
n

Bi tp 4 (Tnh s Catalan theo cng thc T (n) T (i).T (n i) )


i 1

uses crt;
const fi = 'catalan.in';
fo = 'catalan.out';
last = 400;
maxn = 200;
type bignum = array[1..last] of integer;
arr
= array[0..maxn] of bignum;
var
f, g
: text;
t
: arr;
l
: array[1..maxn] of integer;
n
: integer;
procedure read_input;
var i, j : integer;
tmp : bignum; l : integer; ch : char;
begin
assign(f,fi); reset(f);
readln(f,n);
close(f);
end;
function
add(x,y:bignum;
lx,ly:integer;
l:integer):bignum;
var tmp : bignum; sum, carry, i : integer;
begin
89

var

fillchar(tmp,sizeof(tmp),0);
l := lx;
if ly>l then l := ly;
carry := 0;
for i:=last downto last-l+1 do begin
sum := x[i] + y[i] + carry;
tmp[i]:= sum mod 10;
carry := sum div 10;
end;
if carry>0 then begin
tmp[last-l] := carry;
inc(l);
end;
add := tmp;
end;
function
mult1(x:bignum;
lx,num:integer;
l:integer):bignum;
var tmp : bignum; j,s,carry, first : integer;
begin
fillchar(tmp,sizeof(tmp),0);
if num=0 then begin
mult1 := tmp; l:= 0; exit;
end;
first := last-lx+1;
carry := 0;
tmp := x;
for j:=last downto first-8 do begin
if tmp[j]<>0 then begin
s := tmp[j]* num + carry;
carry
:= s div 10;
tmp[j] := s mod 10;
end
else begin
tmp[j] := carry mod 10;
carry
:= carry div 10;
end;
end;
first := first-8;
90

var

repeat
inc(first);
until (tmp[first]<>0) or (first>last);
l := last-first+1;
mult1 := tmp;
end;
procedure
shl_arr
(var
x:bignum;var
lx:integer;
bit:integer);
var z : bignum; i: integer;
begin
fillchar(z,sizeof(z),0);
for i:=last downto last-lx+1 do begin
z[i-bit] := x[i];
end;
lx
:= lx + bit;
x
:= z;
end;
function
multiply(x,y:bignum;
lx,ly:integer;
var
l:integer):bignum;
var sum, tmp : bignum;
lt,lt1,ls,ls1,i,bit
: integer;
begin
fillchar(tmp,sizeof(tmp),0); lt := 0;
fillchar(sum,sizeof(sum),0); ls := 0;
bit := 0;
for i:= last downto last-ly+1 do begin
ls1 := ls;
inc(bit);
if y[i]>0 then begin
tmp := mult1(x,lx,y[i],lt);
if bit>1 then shl_arr(tmp,lt,bit-1);
sum := add(tmp,sum,lt,ls1,ls);
end;
end;
l := ls;
multiply := sum;
end;
procedure calculate;
91

var i,j,lt,lt2 : integer;


tmp : bignum;
begin
fillchar(t,sizeof(t),0);
t[1][last] := 1;
l[1] := 1;
for i:=2 to n do
for j:=1 to i-1 do begin
fillchar(tmp,sizeof(tmp),0);
tmp := multiply(t[j],t[i-j],l[j],l[i-j],lt);
t[i] := add(t[i],tmp,l[i],lt,lt2);
l[i] := lt2;
end;
end;
procedure write_out(z: bignum; l : integer);
var i : integer;
begin
assign(g,fo); rewrite(g);
for i:= last-l+1 to last do
write(g,z[i]);
close(g);
end;
BEGIN
read_input;
calculate;
write_out(t[n],l[n]);
END.
Bi tp 5. Tnh s bng Young
const
fi = 'young.in';
fo = 'young.out';
type
arr
=
var
m,dx,dy
:
n,x,y
:
f
:
procedure read_input;
var i,j:integer;f:text;
begin
assign(f,fi); reset(f);

array[1..300]of integer;
integer;
arr;
text;

92

readln(f,m); // S dng
for i:=1 to m do
read(f,n[i]); // rng mi dng
close(f);
end;
procedure hook; // Tnh di mc ca cc (ch lu di hn 1) vo
mng x
var i,j,k,h,nr : integer;
begin
dx:=0;
for i:=1 to m do
for j:=1 to n[i] do begin
nr := n[i]-j+1;
k
:= i+1;
while (k<=m) and (j<=n[k]) do begin
inc(k);
inc(nr);
end;
if nr>=2 then begin
inc(dx);
x[dx] := nr;
end;
end;
end;
procedure suma(x:arr; dx:integer; y:arr; dy:integer;
var z:arr; var dz:integer);
// Cng hai mng x+y=z
var i,carry,dt,tr : integer;
t
: arr;
begin
if dx>dy then begin // x di hn y th thm cc s 0 vobn tri y
dy=dx
for i:=1 to dx-dy do
t[i] := 0;
dt
:= dx-dy;
for i:=1 to dy do begin
inc(dt);
t[dt] := y[i];
93

end;
for i:=1 to dt do y[i] := t[i];
dy
:= dx;
end
else // y di hn x th b sung cc s 0 vo bn tri x dx=dy
if dy>dx then begin
for i:=1 to dy-dx do t[i] := 0;
dt
:= dy-dx;
for i:=1 to dx do begin
inc(dt);
t[dt] := x[i];
end;
for i:=1 to dt do x[i] := t[i];
dx
:= dy;
end;
dt := 0;
carry := 0;
for i:=dx downto 1 do begin // Thc hin cng x v y t hng
n v
inc(dt);
tr
:= x[i] + y[i] + carry;
t[dt]
:= tr mod 10;
carry
:= tr div 10;
end;
if carry>0 then begin // thm nh
inc(dt);
t[dt]:= carry;
end;
for i:=1 to dt do // o li z
z[i] := t[dt+1-i];
dz := dt;
end;
procedure
produs(x:arr;
dx:integer;
y:arr;
dy:integer;
var z:arr; var dz:integer);
// Thc hin nhn hai s ln bng mng x.y =z
var i,j,k,dt,du : integer;
t,u
: arr;
94

begin
dz:=1; // Khi tr di mng tch
z[1]:=0;
for i:=1 to dy do begin
t[1]:=0;
dt:=1;
for j:=1 to y[dy-i+1] do begin // Tch y[dy-i+1] vi x (
bng cng)
suma(x,dx,t,dt,u,du);
dt:=du;
for k:=1 to du do t[k]:=u[k];
end;
for j:=1 to i-1 do begin // Thm cc s 0 ph hp vo bn
phi ca tch
inc(dt);
t[dt]:=0;
end;
suma(z,dz,t,dt,u,du);
dz := du;
for j:=1 to du do z[j]:=u[j];
end;
end;
procedure exchange(a : integer; var c : arr; var dc :
integer);
// Chuyn i s nguyn a thnh mng c vi di cha a l dc.
var i, tmp : integer;
begin
dc:=0;
while a<>0 do begin // Chuyn cc ch s ca a vo c, c[1] l hng
n v
inc(dc);
c[dc] := a mod 10;
a
:= a div 10;
end;
for i:=1 to dc div 2 do begin // o li mng c, c[dc] l
hng n v
tmp
:= c[i];
95

c[i]
:= c[dc-i+1];
c[dc-i+1]
:= tmp;
end;
end;
procedure calcul; // s! chia cho tch cc phn t ca mng x ( di
cc mc)
var i,s,j,k,nr,dp,dc : integer;
p,c
: arr;
f
: text;
begin
s:=0;
for i:=1 to m do s:=s+n[i]; //To s
for i:=1 to s do y[i]:=i; // y cha cc nhn t ca s!
for i:=1 to dx do begin // Gin c cc tha s chung ca y v x
l k
k
:= 2;
nr
:= x[i];
while nr<>1 do begin
if nr mod k=0 then
while nr mod k=0 do begin
nr := nr div k;
j := 1;
while y[j] mod k<>0 do inc(j);
y[j] := y[j] div k;
end;
inc(k);
end;
end;
//
dp:=1;
p[dp]:=1;
for i:=1 to s do begin
exchange(y[i],c,dc); // Chuyn thng thnh mng y
produs(p,dp,c,dc,p,dp); // Nhn cc phn t ca thng, lu
kt qu vo p
end;
assign(f, fo); rewrite(f); // Hin kt qu
96

for i:=1 to dp do write(f,p[i]);


close(f);
end;
BEGIN
read_input;
hook;
calcul;
END.
Bi tp 6. Nhn nhanh a thc
uses crt;
const maxn= 20;
fi ='dathuc.in';
fo ='dathuc.out';
type arr = array[0..2*maxn] of real;
var
n,i : integer;
p, q, t : arr;
f,g : text;
procedure read_input;
var i: integer;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=0 to n-1 do read(f,p[i]);
for i:=0 to n-1 do read(f,q[i]);
close(f);
end;
procedure mult(p,q: arr; n: integer; var t: arr);
var pl,ql,ph,qh,t1,t2 : arr; rl,rh,rm : arr; i, n2 :
integer;
begin
if n=1 then t[0] := p[0]*q[0]
else begin
n2 := n div 2;
for i:=0 to n2-1 do begin
pl[i] := p[i]; ql[i] := q[i];
end;
for i:=n2 to n-1 do begin
ph[i-n2]:= p[i]; qh[i-n2]:= q[i];
97

end;
for i:=0 to n2-1 do t1[i]:=pl[i]+ph[i];
for i:=0 to n2-1 do t2[i]:=ql[i]+qh[i];
mult(t1,t2,n2,rm);
mult(pl,ql,n2,rl);
mult(ph,qh,n2,rh);
for i:=0 to n-2 do t[i]:= rl[i]; t[n-1]:=0;
for i:=0 to n-2 do t[n+i] := rh[i];
for i:=0 to n-2 do
t[n2+i] := t[n2+i]+rm[i]-(rl[i]+rh[i]);
end;
end;
BEGIN
read_input;
mult(p,q,n,t);
for i:=0 to 2*n-2 do write(t[i]:0:0,' ');
readln;
END.
Bi tp 7. (Clocks IOI-1994).
Thut ton: Gii h phng trnh tuyn tnh bng
phng php Gausse
uses
crt;
const
fi = 'input2.txt';
fo = 'output2.txt';
nh = 'matrix.dat';
var
a
: array[1..10, 1..10] of integer;
name : array[1..10] of integer;
x
: array[1..9] of integer;
g
: text;
procedure docf;
var f : text; i, j, temp : integer;
begin
for i:=1 to 9 do name[i] := i;
for i:=1 to 9 do x[i] := 0;
assign(f,nh); reset(f);
for i:=1 to 9 do
98

for j:=1 to 9 do read(f,a[i,j]);


close(f);
assign(f,fi); reset(f);
for i:=1 to 3 do begin
for j:=1 to 3 do begin
read(f,temp);
if temp>0 then temp := 4-temp;
a[(i-1)*3+j, 10] := temp ;
end;
readln(f);
end;
close(f);
end;
procedure solve;
var i,j,k, row, r : integer;
temp : integer;
begin
for i:=1 to 9 do begin
row := 0;
for r:=i to 9 do
if row=0 then
if a[r,i] <>0 then row := r;
if row=0 then begin
write(g,'He suy bien - khong the quay ');
readln;
halt;
end;
for j:=1 to 10 do begin
temp := a[i,j];
a[i,j] := a[row,j];
a[row,j] := temp;
k := name[i];
name[i] := name[row];
name[row] := k;
99

end;
for r:=i+1 to 9 do begin
temp := a[r,i];
for j:=i to 10 do
a[r,j]:=((-a[r,j]*a[i,i])
mod
4+(temp*a[i,j]) mod 4) mod 4;
end;
end;
if a[9,9]=0 then write(g,'He suy bien')
else
for i:=9 downto 1 do begin
temp := 0;
for j:=i+1 to 9 do
temp := (temp mod 4 + (a[i,j] * x[j]) mod 4)
mod 4;
x[i] := (((a[i,10]-temp) div a[i,i])+ 4) mod
4;
end;
end;
var i, j : integer;
BEGIN
clrscr;
docf;
assign(g,fo); rewrite(g);
solve;
for i:=1 to 9 do
for j:=1 to x[i] do write(g, name[i],' ');
close(g);
END.
Bi tp 8. Dng thp phn ca phn s
Chng trnh.
uses
crt;
const
max
= 15000;
type
m1
= array[0..max] of integer;
var
t,m
: integer;
100

l1,l2
: integer;
a,d
: m1;
vhth
: boolean;
procedure nhap;
begin
write(Nhap tu so va mau so t m: );
readln(t, m);
end;
procedure chia;
var r: integer;
begin
fillchar(a,sizeof(a),0);
fillchar(d,sizeof(d),0);
l1:= 0; {v tr ch s thp phn bt u ca chu k }
l2:= 0; {s ch s phn thp phn, k c trc chu k v trong chu k}
vhth:= true; {xc nhn c l v hn tun hon hay khng}
a[0]:= t div m; {phn nguyn ca phn s t/m}
t
:= t mod m; {phn d u tin to ra phn thp phn}
if t=0 then vhth:= false {nu phn d bng 0 th phn s l s
nguyn}
else
if t>0 then {nu phn d khc khng th tip tc chia to ra phn thp
phn}
repeat
inc(l2);
d[t]:= l2;{ d nh du: khi d l t, chia tip c ch s thp phn
th l2}
t
:= t * 10;
a[l2]:= t div m; {mng kt qu A: T A[i] l ch s thp phn
th i }
t
:= t mod m; {d mi}
if t=0 then begin {d mi bng 0, th phn s l thp phn hu
hn}
vhth:= false; {xc nhn l thp phn hu hn}
break;
end;

101

if d[t]>0 then l1:= d[t]; { gp s d c to ra ch s


thp phn }
{v tr d[t], vy c chu k v suy ra v tr ch s bt u ca
chu k l L1=d[t] }
until d[t]>0;
end;
procedure ghi;
var f: text;i: integer;
begin
assign(f,fo); rewrite(f);
write(f,a[0]); {ghi phn nguyn}
if l2<>0 then write(f,'.'); {nu c phn thp phn th ghi du
chm}
if not vhth then begin {nu khng c chu k}
for i:=1 to l2 do write(f,a[i]);
end
else begin {nu c chu k}
for i:=1 to l1-1 do
write(f,a[i]); {phn thp phn trc chu k}
if l1<>0 then begin
write(f,'(');
for i:=l1 to l2 do write(f,a[i]); {phn chu k}
write(f,')');
end;
end;
close(f);
end;
BEGIN
nhap;
chia;
ghi;
END.
Bi tp 9. Little Bishop
Chng trnh 1
const
max
fi
fo

= 10;
= 'bishops.in';
= 'bishops.out';

102

var
integer;

c1

: array[2..MAX+MAX]of

c2

array[1-MAX..MAX-1]of

integer;
d

: array[0..1,0..MAX*MAX]of

extended;
tnum,k
: integer;
n,bnum,min : integer;
f,g
: text;
procedure duyet(i,x,y:integer); // t tng th i vo (x,y)
var j : integer;
begin
if i>min then exit;
if (c1[x+y]=0)and(c2[x-y]=0)then // ng cho qua (x,y)
cha c tng
begin
c1[x+y]:=1; // nh du c tng trn ng cho x+y
c2[x-y]:=1; //nh du c tng trn ng cho x-y
inc(d[(x+y)mod 2,i]); // Thm 1 tng t vo c mu l
(x+y) mod 2
if y+2<=n then // Cha ht cng mu trn cng dng
duyet(i+1,x,y+2)// th xt t tng i+1 vo cng mu, cng
dng tip theo
else // ht cng mu cng dng
if x<n then // cha ht dng
duyet(i+1,x+1,2-(y+1) mod 2);// xt tng i+1 vo khc
mu dng di
c1[x+y]:=0; // quay lui
c2[x-y]:=0;
end;
// Khng t tng i vo (x,y) m t vo tip theo cng mu
if y+2<=n then
duyet(i,x,y+2) // cng dng
else
if x<n then
duyet(i,x+1,2-(y+1) mod 2); // dng di
end;
103

function count:extended;
var
c : extended;
i : integer;
begin
min:=bnum;
if min>n then min:=n;
fillchar(d,sizeof(d),0);
d[0,0]:=1; // Khi tr s cch t 0 tng vo mu trng
d[1,0]:=1; // Khi tr s cch t 0 tng vo mu en
// ch : 0 tng no trn bn c cng coi l 1 cch t tng
fillchar(c1,sizeof(c1),0);
fillchar(c2,sizeof(c2),0);
duyet(1,1,1); // Xt t tng th nht vo (1,1)
if n mod 2=1 then begin // kch thc bn c l l
fillchar(c1,sizeof(c1),0);
fillchar(c2,sizeof(c2),0);
duyet(1,1,2); // Xt t tng th nht vo (1,2) l mu khc
vi (1,1)
end
else // Kch thc bn c l s chn
d[1]:=d[0]; // th s cch t tng vo trng bng s cch t tng
vo en
c:=0; // Khi tr tng s cch t tng
for i:=0 to bnum do
c := c+ d[1,i]*d[0,bnum-i]; // s cch t i tng vo en
nhn vi
// s cch t (bnum i) tng vo trng.
count:=c;
end;
BEGIN
assign(f,fi); assign(g,fo);
reset(f); rewrite(g);
readln(f,tnum); // s test
for k:=1 to tnum do begin
readln(f,n,bnum); // Kch thc bn c, s tng
writeln(g,count:0:0);
end;
104

close(f); close(g);
END.
Chng trnh 2
const fi
= 'bishops.in';
fo
= 'bishops.out';
maxn = 10;
var
f, g : text;
n, k
: byte;
test : integer;
function count(i,black,white:byte):comp;
var b1,w1,j:longint;
tmp,svt:comp;
begin
if black+white=k then begin
count:=1;
exit;
end;
j:=(i+1) shr 1; //s ng cho cng mu cha xt
if i=2*n-1 then begin
if black+white=k-1 then begin
if odd(j) then count:= n-black
else count:=n-white;
end
else count:=0;
exit;
end;
tmp:=0;
if 2*n-1-i >= k-(black+white) then // cn ng cho
xp tng
tmp:=tmp+count(i+1,black,white); //Khng t tng vo
ng cho i
//xt t tng vo ng cho i
if odd(j) then begin // ng cho loi en
svt:=j-black; //s v tr (s ng cho en cn li) cn c th
t tng
b1:=black+1;w1:=white;
end
105

else begin // ng cho loi trng


svt:=j-white; //s ng cho trng cn li
w1:=white+1;b1:=black;
end;
if svt>0 then
tmp:=tmp+svt*count(i+1,b1,w1);
count:=tmp;
end;
BEGIN
assign(f,fi); reset(f);
assign(g,fo); rewwrite(g);
readln(f,test);
while test>0 do begin
readln(f,n,k);
writeln(g,count(1,0,0):0:0);
dec(test);
end;
close(f); close(g);
END.
2.6. Mt s bi cho hc sinh luyn tp
Bi 1. S hnh phc (Olympiad Ton Nga ln th XX [2008])
Gii hn thi gian: 2 giy. Gii hn b nh: 64MB
Tp D liu vo: lucky.in
Tp Kt qu ra: lucky.out
Bn Vasa rt thch nhng con s m n c gi l s hnh phc vi s k. V
vy, mi ln Vasa nhn thy mt s t nhin n bt k no cng lin tm ngay s
d thch hp no (d 2), sao cho trong h c s d, biu din ca s n c nhiu
ch s k nht.
Yu cu. Vit chng trnh, vi s n v k cho trc, tm s d sao cho trong h
c s d, biu din ca s n c nhiu ch s k nht.
D liu vo.
Tp input cha 2 s nguyn dng thp phn n v k (1 n 1011; 0 k
9)
Kt qu ra.

106

Xut ra hai s: s d l c s cn tm v s L l s lng ch s k dng trong k


hiu s n theo c s d. Nu tm c vi s d th a ra mt s trong chng
khng vt qu 1012 (lun tn ti)
Lucky.in

Lucky.out

49 1
7 5

3 2
3 0

Bi 2. Tm s d trong php chia cho 2M-1


Cho File vn bn DOCSO.TXT t chc nh sau : S u tin dng u
l s nguyn dng m , tip theo l mt du cch ( #32) v sau lin tip l k
ch s gm 0 v 1 biu din dng nh phn ca s nguyn dng N. Hn ch : k
6
M
10 , M<16. Hin kt qu s d ca php chia N cho (2 -1). V d.
DOCSO.TXT
Kt qu trn mn
hnh
3 00110011100010000111 1
Bi 3. Thp H Ni <Thi gian chy chng trnh ti a l 2s>
C 3 cc A, B, C v c N chic a c kch thc tng ng l 1, 2, ..., N.
Trng thi ban u c N chic a u cc A, v a to lun di a nh.
Xt phng php chuyn a sau chuyn a t cc A sang cc C sao cho cc
a to lun lun di cc a nh :
gi th tc Chuyen( N , A, B, C).
Trong :
procedure Chuyen(n , c1, c2, c3);//[ c1, c2, c3 ]=[ A, B, C ]
begin
if n = 1 then begin
chuyn a nm trn cng c1 sang c3; { bc
(*) }
end
else begin
Chuyen(n-1, c1, c3, c2);
Chuyen( 1 , c1, c2, c3 );
Chuyen(n-1, c2, c1, c3);
end;
end;
107

c ngha l ta chuyn n a trn cng ca c1 sang c3 thng qua c2.


S bc chuyn a l 2N-1 (rt ln) ; c 2N-1 ln gi {bc * }. Xt 2 bi
ton sau:
1. Cho trc mt trng thi ca N a, bn hy xt xem trng thi c
xut hin trong qu trnh chuyn a t A sang C theo phng php trn hay
khng? Nu c xut hin th l sau ln gi bc (*) th bao nhiu? ( Gi s
l s Q)
2. Cho trc mt s P, P < 2N . Hi sau ln gi th P th trng thi ca N
a nh th no?
D liu vo file HANOI.INP :
Dng u ghi s N ( N < 101 ).
Dng th hai ghi 1 xu gm N k t ch gm A, B, C l trng thi ca cc
a ( tt nhin cc a to lun lun di cc a nh ).
Dng th ba ghi s P ( nn nh P c th bng 2100-1 ).
Kt qu ra file HANOI.OUT :
Dng u l s Q. ( Q = -1 nu trng thi khng xut hin ).
Dng th hai ghi xu gm N k t l trng thi a sau ln gi th P.
HANOI.INP
HANOI.OUT
3
5
ABC
CCC
7
Vi N=3 th s ln gi (bc *) l 7 v ln lt gi nh sau: trng thi
ban u l AAA.
ln 1 : chuyn a 1 t A sang C -> trng thi CAA.
ln 2 : chuyn a 2 t A sang B -> trng thi CBA.
ln 3 : chuyn a 1 t C sang B -> trng thi BBA.
ln 4 : chuyn a 3 t A sang C -> trng thi BBC.
ln 5 : chuyn a 1 t B sang A -> trng thi ABC.
ln 6 : chuyn a 2 t B sang C -> trng thi ACC.
ln 7 : chuyn a 1 t A sang C -> trng thi CCC.
Bi 4. Thp H Ni (dng 2)
Chc l bn tng xem xt bi ton Thp H Ni. Cc a g c kch
thc khc nhau xp trn 3 cc; ban u tt c xp trn mt cc theo rng:
a ln di. Mc tiu l phi chuyn ton th thp a sang mt cc khc,

108

theo nguyn tc: chuyn mi ln mt a v khng c t a ln trn a nh


hn.
Theo thn thoi, nhng tu s tu vin Tbetian c xa c gng gii
quyt mt trng hp c bit ca bi ton ny vi 47 a v tn mt hng
nghn nm n by gi vn cha xong. Do trng hp ny phi thc hin t
nht 247- 1 php di chuyn m nhng tu s li bt u cng vic khng bng mt
chin lc no c, h chuyn a hn lon trong khi ng l cn xp theo quy
lut hp l nn by gi h tn qu nhiu thi gian m kt qu cha xp c
bao nhiu. H qu mt mi, tuy vy h vn cn thch xp gn gng cc a
trn mt cc tu vi s php chuyn t nht v gi nguyn li th l khng di
chuyn a tri nguyn tc. H mun bit cc no xp ton b cc a trn n l
tt nht v s php chuyn t nht l bao nhiu.
Bn hy vit mt chng trnh gii bi ton ny gip cc tu s. Chng
trnh ca bn phi c kh nng x l mt s bt k N a (0<N100 000). Cc
con s trong tnh ton c th rt ln. V th, cc tu s ch quan tm ti cc s d
ca cc s ly theo mod 1000000.
Input
Dng u tin ca file input HANOI.IN cha s a l s N. Dng th hai
cha 3 s nguyn s1, s2, s3 vi 0 s1, s2, s3 N v s1 + s2 + s3 =N l s cc a
trn mi mt cc trong 3 cc. Dng th ba n dng th nm mi dng cha
rng ca cc a trn mt cc. Chnh xc hn: Dng th (i+2) trong file input
cha cc s nguyn mi,1, mi,,2, , mi, si vi 1 mi,j N l rng ca cc a
trn cc i . Cc a c cho t y ti nh, do mi,1>mi,,2> >mi, si. Ch
rng cc rng cho bi dng rng. Tp N a c cc rng khc nhau. Tt c
cc s cch nhau bi ng mt du cch.
Output
Dng th nht ca file output HANOI.OUT cha s d {1, 2, 3} l s
hiu cc m cc a c th xp trn n vi s php chuyn t nht. Dng th hai
cha s M l s php chuyn cn n (s d theo mod 1 000 000).
V d
HANOI.IN
HANOI.OUT
7
3
2 1 4
4
2 1
3
7 6 5 4
C th dng 4 php chuyn:
109

a cc 2 -> cc 3, a cc 1 -> cc 2, a cc 1 -> cc 3, a cc 2 -> cc 3.


D liu test
Chng trnh ca bn c test vi 20 b d liu vo khc nhau khi
chm. Bng sau dng th nht ca file input l s a N cho mi b d liu
vo:
Test
N

1
5

2
10

Test

11

12

3000

4000

3
15
13

4
20
14

5
50
15

100

150

200

16

17

18

10

1000

2000

19

20

30000 40000 50000 60000 70000 80000 90000 100000

Bi 5. M ha chnh xc
Nhng bi ton lin quan n vic tnh ton gi tr chnh xc ca nhng s
ln l thng gp. V d, tnh ton mn n quc gia l mt cng vic mt nhc
cho nhiu h thng my tnh.
Bi ton ny yu cu bn vit mt chng trnh tnh gi tr chnh xc
ca Rn, vi R l mt s thc ( 0.0 < R < 99.999) v n l mt s nguyn
(0<n25)
D liu vo t file vn bn Expo.IN gm nhiu dng, mi dng l mt cp
gi tr R v n.
Kt qu ghi ra file vn bn gm cc dng, mi dng tng ng vi mt
dng ca file input, n cho gi tr chnh xc ca R n. Vic ghi ra nhng s 0 v
ngha cn loi tr.
V d
EXPO.IN
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
EXPO.OUT
548815620517731830194541.899025343415715973535967221869852721
.0000000514855464107695612199451127676715483848176020072635120
3835429763013462401
43992025569.92857370126648804114665499331870370751166629547672
0493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
110

Bi 6. Cc ch s v con s (Olympiad Ton Nga ln th XXI [2009])


Tp input: digits.in Tp output: digits.out
Gii hn thi gian: 2 giy. Gii hn b nh: 256MB
Nghin cu s v cc ch s thnh phn ca n cng nh nhiu pht
minh c th lm. P-chia rt yu s hc, ngoi nhng bi tp v nh, n cn
thng ngh ra cc bi tp b sung. Mt ln n thm vo mt s t nhin tng
cc ch s ca n. P-chia nhn thy rng c nhng s nh s 20 chng hn
khng c th nhn c t mt s t nhin khc sau khi thm tng cc ch s
ca s . Nhng s nh 20 P-chia khng thch v gi chng l s khng p.
t lu sau, khi P-chia bt u hc Tin hc, n li nghin cu vn trn vi s
t nhin trong h c s 2. V d s nh phn 11102 (trong h thp phn l 14) c
th nhn c t s 11002 (trong h thp phn l 12), thm vo tng cc ch s
ca s 11002 l 102: 11002+102=11102. P-chia quyt nh nghin cu cc s tp
cc s nh phn khng p. Khng kh khn, P-chia tm thy ngay 5 s nh
phn khng p u tin l: 1=12, 4=1002, 6=1102, 13=11012, 15=11112. Cng
vic tm cc s tip theo n chn s gip ca my tnh.
Yu cu vit mt chng trnh, xc nh s lng cc s nh phn khng
p khng vt qu s n.
D liu vo
Dng u tin ca tp input cha s n, vit trong h thp phn
(1 n 1018).
Kt qu ra
Trn dng duy nht ca tp output cha s lng cc s nh phn khng p
khng vt qu n.
V d.
DIGITS.IN
1
13
14

DIGITS.OUT
1
4
4

Bi 8. The Primes (IOI -94)


Hnh 1 cho mt hnh vung m mi hng, mi
ct v 2 ng cho c th c nh s nguyn t c 5
ch s. Cc hng th c t tri qua phi, cc ct th
c t trn xung di. C hai ng cho u c t
tri qua phi. S dng d liu vo t tp INPUT.TXT,

111

hy vit chng trnh xy dng nhng hnh vung sao cho:


- Cc s nguyn t c tng cc ch s l nh nhau (trong v d l 11)
- Ch s gc trn-tri ca hnh vung l cho trc (trong v d l 1)
- Trong mt hnh vung, s nguyn t c th s dng hn mt ln
- Nu c nhiu nghim, cn hin tt c cc nghim
- S nguyn t 5 ch s khng bt u bng 0, nh 00003 l khng hp l.
Chng trnh c d liu t tp INPUT.TXT. Dng u tin l tng cc
ch s ca mi s nguyn t, dng th hai l s cho trc ti gc tri-trn ca
hnh vung. Cc b test lun cho c nghim.
Kt qu ghi ra tp OUTPUT.TXT, ghi 5 dng cho mt nghim, mi dng
gm 5 ch s ca s nguyn t ghi lin nhau. V d
INPUT.TXT

OUTPUT.TXT

11
1

11351
14033
30323
53201
13313
11351
33203
30323
14033
33311
13313
13043
32303
50231
13331

112

CHUYN 3
PHNG PHP QUY HOCH NG
Trong chin lc chia tr, ngi ta chia bi ton cn gii thnh cc bi
ton con. Cc bi ton con li tip tc c chia thnh cc bi ton con nh hn,
c tip tc chia cho n khi ta nhn c cc bi ton con c th gii c d
dng. Tuy nhin, trong qu trnh phn chia nh vy, c th ta s gp li rt
nhiu ln cng mt bi ton con. T tng c bn ca phng php quy hoch
ng l s dng bng lu tr li gii ca cc bi ton con c gii. Khi
gii bi ton con cn n nghim ca cc bi ton con c nh hn, ta ch cn ly
li gii trong bng m khng cn phi gii li. Chnh v th m cc thut ton
c thit k bng phng php quy hoch ng s rt hiu qu.
gii quyt mt bi ton bng phng php quy hoch ng, chng ta
cn tin hnh nhng cng vic sau:
1) Tm cc tham s m t bi ton;
2) Tm nghim ca cc bi ton con nh nht;
3) Tm cng thc (hoc quy tc) xy dng nghim ca bi ton con thng
qua nghim ca bi ton con c nh hn;
4) To bng (da trn cc tham s m t bi ton) lu tr nghim ca
cc bi ton con. Tnh nghim ca cc bi ton con theo cng thc
tm v lu tr vo bng;
5) T cc bi ton con gii tm nghim ca bi ton.
3.1. Lp cc bi ton gii c bng phng php quy hoch ng
Bi ton ti u
o Max / Min
Bi ton m
o m s cu hnh
o Th t t in
Bi ton lp bng phng n
o Xy dng cu hnh
o Tr chi
3.2. Cc cch ci t
Bottom-up (t di ln)
o Khi xc nh c th t cc bi ton con cn gii
o Ci t bng vng lp
o C th gii tha cc bi ton con khng cn thit
Top-down (t trn xung)
o Khng cn thit xc nh c th t cc bi ton con cn gii
o Ci t bng quy c nh c th t cn
113

o Ch gii cc bi ton con cn thit


3.3. phc tp ca thut ton thit k theo phng php quy hoch ng
Gi s bi ton c m t bng cc tham s
v cn tnh hm
mc tiu
. Khi , s bi ton con (hay cn gi l s trng thi) cn
| | | | | |
tnh l
Gi l phc tp tnh nghim ca bi ton con thng qua nghim ca
bi ton con c nh hn (cn gi l chi ph chuyn trng thi).
Khi phc tp ca thut ton bng: S trng thi chi ph chuyn
trng thi (
).
3.4. Nhng vn cn ch khi gii bi ton bng phng php quy hoch ng
3.4.1. Tm cc tham s m t bi ton
Vic tm cc tham s m t bi ton c da trn cc c im, tnh cht
ca bi ton (cng vic ny cn c gi l on nhn trng thi). C th, cn
xc nh c nhng tham s no, ngha mi tham s, min gi tr ca tng tham
s. y l cng vic quan trng mang ngha quyt nh n vic gii quyt bi
ton.
3.4.2. Ti u thut ton
Qua cch tnh phc tp thut ton theo phng php quy hoch ng
( phc tp bng s trng thi nhn vi chi ph chuyn trng thi) ta nhn thy,
gim phc tp thut ton c th gim thiu s trng thi hoc gim chi ph
chuyn trng thi.
3.5. Mt s v d minh ho
3.5.1. Bi ton ct hnh ch nht
C mt hnh ch nht MxN , mi ln ta c php ct mt hnh ch
nht thnh hai hnh ch nht con theo chiu ngang hoc chiu dc v li tip tc
ct cc hnh ch nht con cho n khi c hnh vung thi dng.
Yu cu: Tm cch ct hnh ch nht MxN thnh t hnh vung nht.
Input
- Gm mt dng cha hai s M, N (1M,N500)
Output
- Gm mt dng l kt qu s lng hnh vng t nht.
hcn.inp
10 2
5 6

hcn.out
5
5
114

Phn tch
- D nhn thy bi ton c th m t bng hai tham s
trong l
chiu th nht, l chiu th hai ca hnh ch nht,
l s hnh
[
]
vung t nht c ct t hnh ch nht kch thc
[
] . Khi , dng bng F[1..500,1..500] lu li cc gi tr
.
- Cc bi ton con nh nht (c bn) c
, khi
.
- Cng thc tnh:

- Nh vy, c
bi ton con v chi ph chuyn mt
phc tp ca thut ton l:
.
Ci t bng vng lp
const MAX
=500;
fi
='hcn.inp';
fo
='hcn.out';
var

f
m,n

:array[1..MAX,1..MAX]of longint;
:longint;

procedure tinh(m,n:longint);
var a,b,c,res:longint;
begin
for a:=1 to m do
for b:=1 to n do
begin
if a=b then begin
f[a,b]:=1;
continue;
end;
res:=a*b;
for c:=1 to a-1 do
if res>(f[c,b]+f[a-c,b]) then
res:=(f[c,b]+f[a-c,b]);
for c:=1 to b-1 do
if res>(f[a,c]+f[a,b-c]) then
res:=(f[a,c]+f[a,b-c]);
f[a,b]:=res;
end;
115

, do

end;
BEGIN
assign(input,fi); reset(input);
assign(output,fo); rewrite(output);
readln(m,n);
tinh(m,n);
writeln(f[m,n]);
close(input);
close(output);
END.
Ci t bng quy c nh
const MAX
=500;
fi
='hcn.inp';
fo
='hcn.out';
var

f
m,n

:array[1..MAX,1..MAX]of longint;
:longint;

function tinh(a,b:longint):longint;
var c,res:longint;
begin
if f[a,b]<>-1 then exit(f[a,b]);
if a=b then begin
f[a,b]:=1;
exit(f[a,b]);
end;
res:=a*b;
for c:=1 to a-1 do
if res>(tinh(c,b)+tinh(a-c,b)) then
res:=(f[c,b]+f[a-c,b]);
for c:=1 to b-1 do
if res>(tinh(a,c)+tinh(a,b-c)) then
res:=(f[a,c]+f[a,b-c]);

116

f[a,b]:=res;
exit(f[a,b]);
end;
BEGIN
assign(input,fi); reset(input);
assign(output,fo); rewrite(output);
readln(m,n);
fillchar(f,sizeof(f),255);
writeln(tinh(m,n));
close(input);
close(output);
END.
3.5.2. Bc si
C ng si xp thnh mt vng trn, ng th c vin si. Ta c 2 cch
bc si nh sau:
- Chn hai ng lin nhau c s lng si u l l. Sau bc t hai ng
, mi ng mt vin si;
- Chn hai ng lin nhau vn cn si. Sau ln lt bc t hai ng ,
sau khi bc s si cn li ca mi ng bng s si ban u ca ng
div 2.
Yu cu: Cho s lng si ban u ca mi ng
, hy tnh s cch
khc nhau bc c ht tt c cc si.
Input
- Dng u l s ng si
;
- Dng th hai gm s m t s lng si ca ng.
Output
- Gm mt dng l s lng cch khc nhau mod 111539786.
BOCSOI.INP
BOCSOI.OUT
3
2
1 2 3
3
0
1 1 1
Subtask 1:
Subtask 2:

v
117

Subtask 3: D on gii hn ca

v gii quyt.

Phn tch
Vi Subtask 1, ta c th s dng 3 tham s
m t bi ton v
l s cch khc nhau bc c ht tt c cc ng si. Dng mng
F[0..30,0..30,0..30] lu kt qu ca cc bi ton con
.
thun tin khi vit chng trnh v gii c Subtask 2, ta dng
[
]
m t bi ton (trng hp
th [
]
[ ] bng 0) v dng mng F c 5 chiu (mi chiu t 0 n 30) lu
tr. on lnh tnh c th nh sau:
function qhd(var x:prob):longint;
var i,j :longint;
z
:prob;
tmp :longint;
begin
if f[x[0],x[1],x[2],x[3],x[4]]<>-1 then
exit(f[x[0],x[1],x[2],x[3],x[4]]);
tmp:=0;
for i:=0 to n-1 do begin
j:=(i+1) mod n;
z:=x;
if (z[i]>0) and (z[j]>0) then begin
if odd(z[i]) and odd(z[j]) then begin
dec(z[i]); dec(z[j]);
tmp:=(tmp + qhd(z)) mod NMOD;
end;
z[i]:=x[i] div 2; z[j]:=x[j] div 2;
tmp:=(tmp + qhd(z)) mod NMOD;
end;
end;
f[x[0],x[1],x[2],x[3],x[4]]:=tmp;
exit(tmp);
end;

118

S bi ton con theo thut ton trn l


, chi ph chuyn trng
thi
. Do d, phc tp theo thut ton trn l
.
Nh vy, chng trnh trn c th p ng cho Subtask 2. Vi Subtask 3, ta c
nhn xt sau: xt mt ng c s si bng , c 2 trng hp xy ra:
- nu
, ta c th bc 1 vin a ng si v cn , sau s v
cn vin;
- nu
, ch c cch bc a ng si v cn vin.
Nhn thy cc kh nng
khng xy ra. Nh vy, bn
cht phc tp thut ton trn l
v c th
gii vi
. Nhng vn kh khn l khng th khai bo c mng
5 chiu, mi chiu kch thc 30000 lu tr c. gii quyt vn ny,
vi tng ng si ta xt cc gi tr c th xy ra ri nh th t cc gi tr ny t
nh n ln, vic lu tr s theo s th t gi tr. Chng trnh hon chnh di
y.
const

MAX
LIMIT
NMOD
fi
fo

=5;
=28;
=111539786;
='bocsoi.inp.';
='bocsoi.out';

type

prob

=array[0..MAX]of longint;

var

s
:prob;
idx
:array[0..30000]of longint;
f
:array[0..LIMIT,0..LIMIT,0..LIMIT,0..LIMIT,0..LIMIT]
of longint;
n
:longint;
ft,gt
:text;
procedure chuanbi;
var i, maxIdx :longint;
function getIndex(i:longint):longint;
begin
if idx[i]<>-1 then exit(idx[i]);
if odd(i) then idx[i]:=getIndex(i-1)+1
else idx[i]:=getIndex(i div 2)+1;
exit(idx[i]);
119

end;
begin
fillchar(idx,sizeof(idx),255);
idx[0]:=0;
maxIdx:=0;
for i:=30000 downto 0 do begin
idx[i]:=getIndex(i);
if idx[i]>maxIdx then maxIdx:=idx[i];
end;
//
writeln(maxIdx);
end;
function
var i,j
y,z
tmp
begin

qhd(var x:prob):longint;
:longint;
:prob;
:longint;

for i:=0 to 4 do y[i]:=idx[x[i]];


if f[y[0],y[1],y[2],y[3],y[4]]<>-1 then
exit(f[y[0],y[1],y[2],y[3],y[4]]);
tmp:=0;
for i:=0 to n-1 do begin
j:=(i+1) mod n;
z:=x;
if (z[i]>0) and (z[j]>0) then begin
if odd(z[i]) and odd(z[j]) then begin
dec(z[i]); dec(z[j]);
tmp:=(tmp + qhd(z)) mod NMOD;
end;
z[i]:=x[i] div 2; z[j]:=x[j] div 2;
tmp:=(tmp + qhd(z)) mod NMOD;
end;
end;
120

f[y[0],y[1],y[2],y[3],y[4]]:=tmp;
exit(tmp);
end;
procedure xuly;
var i :longint;
begin
fillchar(f,sizeof(f),255);
f[0,0,0,0,0]:=1;
fillchar(s,sizeof(s),0);
readln(ft,n);
for i:=0 to n-1 do
read(ft,s[i]);
writeln(gt,qhd(s));
end;
BEGIN
chuanbi;
assign(ft,fi); reset(ft);
assign(gt,fo); rewrite(gt);
xuly;
close(ft);
close(gt);
END.
3.5.3. Least-Squares Segmentation (LSS)
Ta nh ngha trng s ca on s t s v tr th i n v tr th j ca
dy s nguyn A[1], A[2], ..., A[N] l:

[ ]

trong

[ ]

Yu cu: Cho dy s nguyn A gm N s A[1], A[2], ..., A[N] v s nguyn


dng G (1 < G2 < N). Hy chia dy A thnh ng G on tng trng s l
nh nht.
D liu vo trong file vn bn LSS.INP c dng:
- Dng u gm hai s N v G (1 < G2 < N < 1001)
121

- N dng tip theo, mi dng mt s nguyn m t dy s A (0<A[i]<106)


Kt qu ra file vn bn LSS.OUT c dng: gm mt dng cha mt s thc
duy nht l p n ca bi ton. (a ra theo qui cch :0:2)
LSS.INP
5 2
3
3
3
4
5

LSS.OUT
0.50

Phn tch
Gi
l tng trng s ca cch chia ti u cc phn t t 1 n thnh
on, khi
trng s on t phn t
n
S bi ton con l
. Chi ph chuyn trng thi l
, trong bao
gm vic tnh trng s on t phn t
n . Nh vy, phc tp theo
thut ton trn l
v khng p ng c vi
C th gim phc tp thut ton bng cch ti u cng thc tnh trng s
on t phn t
n . Thay v phi tnh trng s on t phn t
n mt
th vic tnh ny ch mt
, khi phc tp thut ton
ch cn
const max
=1000;
fi
='lss.inp';
fo
='lss.out';
var

a
f
sum,sum2
n,g

:array[1..max]of extended;
:array[1..max,1..35]of extended;
:array[0..max]of extended;
:longint;

procedure docf;
var i
:longint;
begin
readln(n,g);
for i:=1 to n do begin
readln(a[i]);
sum[i]:=sum[i-1]+a[i];
sum2[i]:=sum2[i-1]+ a[i] * a[i];
end;
end;
122

procedure qhd;
var i,j,k,soNhom :longint;
p
:extended;
begin
for i:=1 to n do
for j:=1 to g do f[i,j]:=1e100;
for i:=1 to n do f[i,1]:=sum2[i]-sqr(sum[i])/i;
for i:=2 to n do begin
soNhom:=i;
if i>g then soNhom:=g;
for j:=2 to soNhom do
for k:=i downto j do begin
p:=(sum2[i]-sum2[k-1])-sqr(sum[i]-sum[k1])/(i-k+1);
if f[i,j]>p+f[k-1,j-1] then f[i,j]:=p+f[k1,j-1];
end;
end;
end;
BEGIN
assign(input,fi); reset(input);
assign(output,fo); rewrite(output);
docf;
qhd;
writeln(f[n,g]:0:2);
close(input); close(output);
END.
3.5.4. TKSEQ
Cho dy s A gm N s nguyn v s nguyn M. Tm dy ch s
1i1<i2<<i3MN sao cho:
(

123

t gi tr ln nht.
D liu vo trong file TKSEQ.INP c dng:
- Dng u l gm 2 s nguyn N, M (0<3MN500)
- Dng 2 gm N s nguyn a1, a2,, aN (|ai|<109)
Kt qu ra file TKSEQ.OUT c dng: gm mt s duy nht S ln nht tm
c
TKSEQ.INP
5 1
1 2 3 4 5

TKSEQ.OUT
4

Phn tch
Yu cu bi ton l chn ra 3M phn t trong N phn t v chia thnh M nhm.
Tng t nh bi 3.5.3, ta gi
l tng theo cch chn ti u nhm
trong cc phn t t 1 n , khi
+ tng ti u
cch chn 3 ch s trong on t phn t
n .
S bi ton con l
. Chi ph chuyn trng thi mt nhn vi chi ph tnh
tng ti u cch chn 3 ch s trong on t phn t
n . Vic tnh tng
ti u cch chn 3 ch s trong on t phn t
n c th chun b
trc v lu tr vo mng hai chiu, khi vic tnh tng ch cn
.
phc tp thut ton l:
.
Tuy nhin, ta c th thay i cch nhn v c c li gii n gin ngn gn
hn. Gi
l tng chn ra phn t trong phn t u tin ca dy,
[] ,
trong

const

max
fi
fo
limit
cs

=500;
='tkseq.inp';
='tkseq.out';
=trunc(1e13);
:array[0..2]of int64=(1,1,-1);

var

a
l
n,m
f

:array[1..max]of int64;
:array[0..max,0..max]of int64;
:longint;
:text;

procedure docf;
var i :longint;
begin
124

assign(f,fi); reset(f);
readln(f,n,m);
for i:=1 to n do read(f,a[i]);
close(f);
end;
procedure tinh;
var i,j,k,mm
:longint;
p
:int64;
begin
m:=m*3;
for i:=0 to n do
for j:=0 to m do l[i,j]:=-limit;
for i:=0 to n do l[i,0]:=0;
for i:=1 to n do begin
if m>i then mm:=i else mm:=m;
for j:=1 to mm do
for k:=i downto j do
if l[i,j]<l[k-1,j-1]+a[k]*cs[j mod 3] then
l[i,j]:=l[k-1,j-1]+a[k]*cs[j mod 3];
end;
assign(f,fo); rewrite(f);
write(f,l[n,m]);
close(f);
end;
BEGIN
docf;
tinh;
END.

125

3.5.5. K lc DOMINO
Mt k lc th gii v xp domino
c ghi nhn vo hm 17/11/2006.
K lc ny thuc v H Lan khi
4.079.381 qun domino ln lt
xung theo phn ng dy chuyn trong
ting v tay reo h ca cc c ng
vin. Nhng ngi t chc s kin
Ngy Domino H Lan cho bit,
4.079.381 qun domino ln lt
xung trong vng 2 gi ng h.
Nhng qun domino di ng uyn chuyn trn nn nhng iu nhc c in
v ng i l nt c bit nht ca mn trnh din domino. Tc gi Robin
Paul Weijers ni: Hn 4 triu qun domino, iu ny cha bao gi xy ra.
Chng ti cn thnh cng trong vic khin cho nhng qun bi domino nhy
ma trong ting nhc. Ti rt hnh phc v thnh cng.
Vi mn trnh din tuyt vi ny, nhng k lc gia domino H Lan ph v
k lc ca chnh h lp c nm 2005 vi 4.002.136 qun bi domino.
Sp ti, Bm d nh xy dng mt cng trnh ln hn ph k lc ca ngi
H Lan. Cng trnh s bao gm 2 cng on chnh:
- Cng on 1: Xp
qun domino vo cc cn trng trn hnh
ch nht kch thc
, trong hnh ch nht c
c t trc vt trang tr.
- Cng on 2: Xp
qun domino thnh mt dy di
,
mi hng c ng
qun (c th c hiu nh xp vo hnh
ch nht kch thc
).
im c o trong cng trnh ny l s phi mu gia cc qun domino ln
cn chung cnh. Cc qun domino c xp bng hai loi domino, loi 1 c
mu xanh nht v loi 2 c mu xanh m. Qun domino v tr
s phi
tha mn iu kin: nu
l th mu qun domino ny s phi c mu khng
nht hn cc qun cc chung cnh (nu c), nu
chn th mu qun
domino ny s phi c mu khng m hn cc qun cc chung cnh (nu
c).
c nhng thng tin th v khi gii thiu v cng trnh, Bm mun bit s
lng cch xp khc nhau ca cng on 1 v cng on 2. Hai cch xp c
126

gi l khc nhau nu khi chng kht 2 cch ln nhau (khng xoay hoc lt) c t
nht mt qun khc mu.
D liu vo trong file DOMINO.INP c dng:
- Dng 1: gm 1 s nguyn dng
, cc kt qu tm c s
mod cho ;
- Dng 2: bt u l 3 s nguyn dng
,
trong
l kch thc hnh ch nht trong cng on 1, l s
lng trong hnh ch nht t vt trang tr, tip theo l cp s, cp
s
l ta t vt trang tr;
- Dng 3: gm 2 s nguyn dng
l kch thc
hnh ca cng on 2.
Kt qu ra file DOMINO.OUT c dng:
- Dng 1: s cch xp cng on 1 khc nhau mod
- Dng 2: s cch xp cng on 2 khc nhau mod
DOMINO.INP
1000
5 5 1 3 3
3 10000

;
.

DOMINO.OUT
240
593

Phn tch
Cch gii cho phn 1: QH vi trng thi
c ngha l xp n
(xp ln lt t trn xung di, t tri qua phi) vi l dy gm bit 0, 1 m
t trng thi
u dng v
cui dng
. thun
tin lu tr, s c m ho l mt s nguyn
m trong
biu din nh phn ca l dy .
Cch gii cho phn 2: QH vi trng thi
c ngha l xp n hng c
trng thi hng trc l vi l dy bit 0, 1 tha mn tch cht mu trn mt
dng (vi =8 th <=55). Dng nhn ma trn tnh nhanh.
const

MAXN
MAXN2
MAXSL
fi
fo

=8;
=16;
=55;
='DOMINO.INP';
='DOMINO.OUT';
127

type

dsType
=array[1..MAXN]of longint;
matrixType =array[1..MAXSL,1..MAXSL]of longint;

var

m,n,nMod,SL:longint;
ds
:array[1..2,1..1 shl MAXN]of dsType;
count
:array[1..2]of longint;
A, B, AB
:matrixType;
x
:dsType;
sum
:longint;
f,g
:text;
dp
:array[1..MAXN2+1,1..MAXN2,0..1 shl
MAXN2]of longint;
w
:array[1..MAXN2,1..MAXN2]of longint;
mu2
:array[1..MAXN2]of longint;
function check(t:longint):boolean;
var i :longint;
begin
for i:=2 to n do begin
if ((i+t) mod 2 = 1)and(x[i]<x[i-1]) then
exit(false);
if ((i+t) mod 2 = 0)and(x[i]>x[i-1]) then
exit(false);
end;
exit(true);
end;
procedure try(i :longint);
var c : longint;
begin
if i>n then begin
for c:=1 to 2 do
if check(c) then begin
inc(count[c]); ds[c][count[c]]:=x;
end;
end
else begin
for c:=0 to 1 do
begin
x[i]:=c;
try(i+1);
128

end;
end;
end;
function ghep(j1,j2,i:longint):boolean;
var j :longint;
begin
for j:=1 to n do begin
if ((i+1+j) mod 2=1)and(ds[(i+1) mod
2+1][j1][j]>ds[i mod 2+1][j2][j]) then exit(false);
if ((i+1+j) mod 2=0)and(ds[(i+1) mod
2+1][j1][j]<ds[i mod 2+1][j2][j]) then exit(false);
end;
exit(true);
end;
function mulMatrix(X, Y: matrixType):matrixType;
var i,j,k :longint;
Z
:matrixType;
begin
fillchar(Z,sizeof(Z),0);
for i:=1 to SL do
for j:=1 to SL do
for k:=1 to SL do
Z[i,j]:=(Z[i,j]+int64(X[i,k])*Y[k,j]) mod nMod;
exit(Z);
end;
function expMatrix(X: matrixType;
e:longint):matrixType;
var Y
:matrixType;
begin
if e=1 then exit(X);
Y:=expMatrix(X,e div 2);
Y:=mulMatrix(Y,Y);
if e mod 2 = 1 then Y:=mulMatrix(Y,X);
exit(Y);
end;
procedure chuanbi;
var i,j :longint;
129

begin
count[1]:=0; count[2]:=0;
try(1);
SL:=count[1];
fillchar(A,sizeof(A),0);
for i:=1 to SL do
for j:=1 to SL do
A[i,j]:=ord(ghep(i,j,1));
fillchar(B,sizeof(B),0);
for i:=1 to SL do
for j:=1 to SL do
B[i,j]:=ord(ghep(i,j,2));
AB:=mulMatrix(A,B);
end;
procedure qhd2;
var i,j :longint;
begin
m:=m-1;
if m>1 then begin
AB:=expMatrix(AB,m div 2);
if m mod 2 = 1 then AB:=mulMatrix(AB,A);
sum:=0;
for i:=1 to SL do
for j:=1 to SL do sum:=(sum + AB[i,j]) mod
nMod;
end
else sum:=SL;
end;
procedure xuly2;
begin
readln(f,n,m);

130

chuanbi;
qhd2;
writeln(g,sum);
end;
function check1(i,j,t,c:longint):boolean;
begin
if (i+j) mod 2 = 1 then begin
if (j>1)and(c=0)and(t and mu2[j1]>0)and(w[i,j-1]=0) then exit(false);
if (i>1)and(c=0)and(t and mu2[j]>0)and(w[i1,j]=0) then exit(false);
end
else begin
if (j>1)and(c=1)and(t and mu2[j1]=0)and(w[i,j-1]=0) then exit(false);
if (i>1)and(c=1)and(t and mu2[j]=0)and(w[i1,j]=0) then exit(false);
end;
exit(true);
end;
function tinh(i,j,t :longint):longint;
var c
: longint;
sum : longint;
begin
if dp[i,j,t]>=0 then exit(dp[i,j,t]);
if i>m then begin
dp[i,j,t]:=1;
exit(1);
end;
if w[i,j]=1 then begin
if j<n then dp[i,j,t]:=tinh(i,j+1,t)
else dp[i,j,t]:=tinh(i+1,1,t);
exit(dp[i,j,t]);
end;

131

sum:=0;
for c:=0 to 1 do
if check1(i,j,t,c) then
begin
if j<n then sum:=sum + tinh(i,j+1,(t or
mu2[j])-(1-c)*mu2[j] )
else sum:=sum + tinh(i+1,1,(t or mu2[j])(1-c)*mu2[j] );
end;
dp[i,j,t]:=sum mod nMod;
exit(dp[i,j,t]);
end;
procedure xuly1;
var i,j,k,T :longint;
begin
fillchar(w,sizeof(w),0);
read(f,m,n,T);
for k:=1 to T do begin
read(f,i,j);
w[i,j]:=1;
end;
mu2[1]:=1;
for k:=2 to MAXN2 do mu2[k]:=mu2[k-1]*2;
fillchar(dp,sizeof(dp),255);
writeln(g,tinh(1,1,0));
end;
BEGIN
assign(f,fi); reset(f);
assign(g,fo); rewrite(g);
readln(f,nMod);
xuly1;
132

xuly2;
close(f);
close(g);
END.
3.5.6. C phiu (VOI2010_R2)
Hin nay th trng chng khon Vit Nam l mt knh huy ng vn hiu qu
cho cc doanh nghip cng nh l mt knh u t ti chnh tim nng cho cc
nh u t. Mt nh u t mun thc hin vic mua v bn c phiu ca n
cng ty tin hc c nim yt c phiu trn th trng trong giai on gm D
ngy.
Sau nhiu ngy phn tch, nh u t rt ra c cc d bo sau:
1.
S lng c phiu ca cng ty i (1 i n) trn th trng l Qi;
2.
Gi mt c phiu ca cng ty i trong ngy t l Pt,i (0 < Pt,i 106);
3.
Ph giao dch mua bn mt c phiu l 1 ng.
Lut u t nh sau: Ti mt ngy t (1 t D) nh u t c th tin hnh hai
bc:

Bc 1 Bn c phiu: Nu c mi c phiu ca cng ty i trong ti


khon, nh u t c th tin hnh bn si (0 si mi) c phiu. S tin
bn c phiu tr i ph giao dch (si Pt,i si) s c chuyn vo ti
khon ca nh u t ngay lp tc. S lng c phiu ca cng ty i trong
ti khon ca nh u t cn li l (mi si). Vi mi loi c phiu, nh
u t c th bn hoc khng bn c phiu.

Bc 2 Mua c phiu (thc hin sau khi tin hnh xong Bc


1): Nu mun mua si c phiu ca cng ty i, nh u t phi tr ngay lp
tc tin mua c phiu v ph giao dch (v th mun thc hin giao dch
ny, s tin trong ti khon phi ln hn hoc bng s tin phi tr). S
tin trong ti khon ca nh u t ngay lp tc s b tr i mt lng l
(si Pt,i + si) ng. S lng c phiu mua ngay lp tc s c chuyn
vo ti khon ca nh u t. Ch : tng s c phiu ca cng ty i trong
ti khon ca nh u t khng th ln hn Qi. Vi mi loi c phiu,
nh u t c th mua hoc khng mua c phiu.
Yu cu: Ti thi im u tin, nh u t c k ng trong ti khon, v
khng c c phiu ca bt c cng ty no. Da vo d bo nu trn, hy gip
nh u t tm cch mua bn c phiu t ngy th nht cho n ht ngy th D,
tng lng tin thu c l ln nht.
D liu: Vo t file vn bn STOCK.INP:
133


Dng u cha 3 s nguyn dng n, k, D (n 3, k 109, D
30);

Dng th hai cha n s nguyn dng Q1, Q2,, Qn cho bit s


lng c phiu ca cc cng ty nim yt trn th trng (Qi 100, i = 1,
2,, n);

Dng th t trong D dng tip theo cha n s nguyn dng cho


bit gi c phiu ca n cng ty ti ngy t.
Cc s trn cng mt dng c ghi cch nhau bi t nht mt du cch.
Kt qu: Ghi ra file vn bn STOCK.OUT mt s nguyn dng duy nht l
tng lng tin nh u t c c sau D ngy theo cch mua bn c phiu tm
c.
V d:
STOCK.INP
2 100 5
15 20
4 5
5 4
7 3
6 10
5 12

STOCK.OUT
255

Tm hiu chng trnh gii sau (s c trao i khi tp hun).


const max
=100;
fi
='stock.inp';
fo
='stock.out';
var

l
q
cost
n,m,t

:array[0..max,0..max,0..max]of int64;
:array[1..3]of longint;
:array[1..10000,1..3]of int64;
:int64;

procedure ReadIn;
var f
:text;
i,j
:longint;
begin
assign(f,fi); reset(f);
readln(f,n,m,t);
for i:=1 to n do read(f,q[i]);
for i:=1 to t do
for j:=1 to n do read(f,cost[i,j]);
close(f);
134

for i:=n+1 to 3 do q[i]:=0;


n:=3;
end;
procedure Process;
var i1,i2,i3,k :longint;
money
:int64;
begin
for i1:=0 to q[1] do
for i2:=0 to q[2] do
for i3:=0 to q[3] do l[i1,i2,i3]:=-1;
l[0,0,0]:=m;
for k:=1 to t do begin
// ban co phieu
for i1:=q[1] downto 0 do
for i2:=q[2] downto 0 do
for i3:=q[3] downto 0 do begin
money:=l[i1,i2,i3];
if money > -1 then
begin
if (i1>0) and (l[i1-1,i2,i3] <
money+cost[k,1]-1) then
l[i1-1,i2,i3] := money+cost[k,1]-1;
if (i2>0) and (l[i1,i2-1,i3] <
money+cost[k,2]-1) then
l[i1,i2-1,i3] := money+cost[k,2]-1;
if (i3>0) and (l[i1,i2,i3-1] <
money+cost[k,3]-1) then
l[i1,i2,i3-1] := money+cost[k,3]-1;
end;
end;
// mua co phieu
for i1:=0 to q[1] do
135

for i2:=0 to q[2] do


for i3:=0 to q[3] do begin
money:=l[i1,i2,i3];
if money > -1 then
begin
if (i1<q[1]) and (money > cost[k,1])
and (l[i1+1,i2,i3] < money-cost[k,1]-1) then
l[i1+1,i2,i3] := money-cost[k,1]-1;
if (i2<q[2]) and (money > cost[k,2])
and (l[i1,i2+1,i3] < money-cost[k,2]-1) then
l[i1,i2+1,i3] := money-cost[k,2]-1;
if (i3<q[3]) and (money > cost[k,3])
and (l[i1,i2,i3+1] < money-cost[k,3]-1) then
l[i1,i2,i3+1] := money-cost[k,3]-1;
end;
end;
end;
end;
procedure WriteOut;
var f :text;
begin
assign(f,fo); rewrite(f);
write(f,l[0,0,0]);
close(f);
end;
BEGIN
ReadIn;
Process;
WriteOut;
END.
3.5.7. VACCINE (ACMVN2010)
Amino acid l thnh phn c bn ca s sng. Amino acid gm 20 loi khc
nhau {A,C,D, E, F, G, H, I, K, L, M, N, P, Q, R, S, T, V, W, Y}. Protein l mt
chui amino acid v c biu bi mt xu k t P, trong P(t) l amino acid
136

v tr th t trong P. Cc chui amino acid khc nhau s to ra cc protein khc


nhau. M-vaccine l mt loi protein c di khng qu 500 amino acid c
dng tiu dit cc loi vi rt.
Cc nh khoa hc ang tp trung nghin cu protein ca vi rt POKTE nhm
sn xut ra cc loi M-vaccine tiu dit loi vi rt ny.
Ta ni, M-vaccine V c th tiu dit c k amino acid trong protein P ca vi
rt POKTE nu tn hai dy ch s (X1 < X2 <<Xk) v (Y1 < Y2 <<Yk) sao
cho V(Xi) = P(Yi) vi i =1k. Mc tiu dit vi rt POKTE ca M-vaccine V
c xc nh bng gi tr k ln nht.
Cho protein P ca vi rt POKTE v N loi M-vaccine, nhim v ca bn l tm
loi M-vaccine trong N loi M-vaccine c mc tiu dit vi rt POKTE ln
nht.
D liu vo (VACCINE.INP)
D liu vo gm nhiu b d liu tng ng vi nhiu test. Dng u tin cha
mt s nguyn dng khng ln hn 20 l s lng cc b d liu. Cc dng
tip theo cha cc b d liu.
Vi mi b d liu, dng u tin cha s nguyn N (1 N 200) l s lng
loi M-vaccine. Dng th hai cha mt xu di khng vt qu 10000 l
biu din protein P ca vi rt POKTE. N dng tip theo, mi dng cha mt
xu biu din cho mt loi M-vaccine.
D liu ra (VACCINE.OUT)
Vi mi b d liu, ghi ra trn mt dng mt s nguyn l mc tiu dit ca
loi M-vaccine c mc tiu dit vi rt POKTE ln nht.
VACCINE.INP
1
5 1
ENRPPNVPES
TEV
LNRC
HKVR
FWW
PWP

VACCINE.OUT
2

137

Tm hiu chng trnh gii sau (s c trao i khi tp hun).


{$H+}
const MAXM
MAXN
fi
fo
var

=500;
=10000;
='VIRUS.INP';
='VIRUS.OUT';

w
:array[0..MAXM+1,0..MAXM+1]of longint;
next :array[0..MAXN+1,'A'..'Z']of longint;
a,b
:string;
f,g
:text;
na,nb,T,alpha
:longint;
mk,mkMin
:longint;
count
:longint;
c
:char;
nTest
:longint;
tong,kq
:longint;

procedure makeNext(c1,c2:char);
var c :char; j:longint;
begin
fillchar(next,sizeof(next),0);
for c:=c1 to c2 do begin
next[nb,c]:=nb+1; next[nb+1,c]:=nb+1;
for j:=nb-1 downto 0 do
if b[j+1]=c then next[j,c]:=j+1
else next[j,c]:=next[j+1,c];
end;
end;
function tinh:longint;
var i,j :longint;
begin
for i:=0 to na do begin
for j:=0 to na do w[i,j]:=nb+1;
w[i,0]:=0;
end;
mk:=0;
138

for i:=0 to na-1 do begin


if alpha+1-na+i>0 then mkMin:=alpha+1-na+i
else mkMin:=0;
for j:=mk downto mkMin do begin
if w[i+1,j]>w[i,j] then w[i+1,j]:=w[i,j];
if w[i+1,j+1]>next[w[i,j],a[i+1]] then begin
if j+1>mk then mk:=j+1;
w[i+1,j+1]:=next[w[i,j],a[i+1]];
end;
end;
end;
exit(mk);
end;
BEGIN
assign(f,fi); reset(f);
assign(g,fo); rewrite(g);
readln(f,nTest);
while nTest>0 do begin
dec(nTest); tong:=0;
count:=0;
alpha:=0;
readln(f,T);
readln(f,b);
nb:=length(b);
makeNext('A','Z');
while T>0 do begin
readln(f,a); na:=length(a);
dec(T);
139

kq:=tinh;
if kq>alpha then alpha:=kq;
end;
writeln(g,alpha);
end;
close(f);
close(g);
END.
3.5.8. Bng s (VOIR2_2012)
Gi s A l li vung gm m dng v n ct. Cc dng ca li c
nh s t 1 n m, t trn xung di. Cc ct ca li c nh s t 1 n
n, t tri sang phi. nm trn giao ca dng i v ct j ca li gi l (i, j).
Vi s nguyn dng x, gi f(x) l s lng s nguyn dng khng vt
qu x m trong biu din nh phn c hai bt 1 ng cnh nhau. V d, f(5)=1 v
trong cc s nguyn dng b hn hoc bng 5 ch c s 3 c biu din nh
phn vi hai bt 1 ng cnh nhau.
Cho dy s nguyn dng gm mn s b1, b2, ..., bmn. Ta s ln lt in
cc s hng ca dy
f(b1) mod 3, f(b2) mod 3, ..., f(bmn) mod 3
vo cc ca li A theo th t t trn xung di t tri qua phi. Gi
bng s thu c l B.
Xt truy vn sau y i vi bng s thu c B: Cho hai s nguyn p v
q (1 p q m), hy cho bit din tch ln nht ca hnh ch nht gm cc
nm trong phm vi t dng th p n dng th q ca bng B m trong chnh
lch gia phn t ln nht v phn t nh nht khng vt qu 1.
Yu cu: Cho m, n, dy s b1, b2, ..., bmn v k b pi, qi (i = 1, 2, ..., k) tng
ng vi k truy vn, hy a ra cc cu tr li cho k truy vn.
D liu: Vo t file vn bn NUMTAB.INP trong :
Dng u tin cha hai s nguyn m, n (1 m, n 1000);
Dng tip theo cha dy s b1, b2, ..., bmn (mi s khng vt qu 109);
140

Dng tip theo cha s nguyn k (1 k 106);


Dng th i trong s k dng tip theo cha 2 s nguyn pi v qi (i = 1, 2,
..., k).
Hai s lin tip trn cng mt dng c ghi cch nhau bi du cch.
Kt qu: Ghi ra file vn bn NUMTAB.OUT gm k dng, mi dng cha mt
s l cu tr li cho truy vn theo th t xut hin trong d liu vo.
V d:
NUMTAB.INP
3 3
3 8 7 6 3 2 4 6
6
4
1 1
1 2
1 3
3 3

NUMTAB.OUT
3
4
4
3

Tm hiu chng trnh gii sau (s c trao i khi tp hun).


#include <iostream>
#include <fstream>
using namespace std;
const int MAX = 1000+5;
int
int
int
int
int
int
int

a[MAX][MAX], m, n;
kq01[MAX][MAX], kq12[MAX][MAX], w[MAX][MAX];
xLen, xArr[32];
fx[20][2][2][2][2];
fy[1<<15][2][2][2][2];
dx[20][2][2][2][2];
dy[1<<15][2][2][2][2];

int qhd(int pos, int firstDigit, int firstOk, int


lastDigit, int lastOk) {
int &res =
fx[pos][firstDigit][firstOk][lastDigit][lastOk];
if
(dx[pos][firstDigit][firstOk][lastDigit][lastOk])
return res;
141

if (pos>15) return ((firstDigit == lastDigit) &&


(firstOk == lastOk));
res = 0;
for (int cs = 0; cs<=max(xArr[pos],firstOk);
cs++)
if (firstDigit+cs!=2)
res += qhd(pos+1, cs, firstOk |
(cs<xArr[pos]), lastDigit, lastOk);
dx[pos][firstDigit][firstOk][lastDigit][lastOk] =
1;
return res;
}
int tinhSL15(int x, int firstDigit, int firstOk, int
lastDigit, int lastOk) {
int &res =
fy[x][firstDigit][firstOk][lastDigit][lastOk];
if
(dy[x][firstDigit][firstOk][lastDigit][lastOk])
return res;
dy[x][firstDigit][firstOk][lastDigit][lastOk] =
1;
xLen = 15;
for (int i=1; i<=15; i++) {
xArr[xLen] = x & 1;
xLen--;
x = x >> 1;
}
memset(fx,0,sizeof(fx));
memset(dx,0,sizeof(dx));
return (res = (qhd(1, firstDigit, firstOk,
lastDigit, lastOk)));
}
int tinhSL(int x) {
int xA = x >> 15, xB = x & ((1<<15)-1);
int res = 0;
142

for (int digit=0; digit<=1; digit++)


for (int ok=0; ok<=1; ok++) {
int tmp = tinhSL15(xB, digit, ok, 0, 0);
tmp += tinhSL15(xB, digit, ok, 0, 1);
tmp += tinhSL15(xB, digit, ok, 1, 0);
tmp += tinhSL15(xB, digit, ok, 1, 1);
res = res + tinhSL15(xA, 0, 0, digit, ok
)*tmp;
}
return (x+1 - res);
}
void docFile() {
int x;
memset(fy,0,sizeof(fy));
memset(dy,0,sizeof(dy));
scanf("%d%d",&m,&n);
for (int i=1; i<=m; i++)
for (int j=1; j<=n; j++) {
scanf("%d",&x);
a[i][j] = tinhSL(x) % 3;
}
}
void chuanBi(int A, int B, int kq[MAX][MAX]) {
int s[MAX], p[MAX], h[MAX], top;
memset(h,0,sizeof(h));
memset(p,0,sizeof(p));
memset(kq,0,sizeof(kq));
memset(w,0,sizeof(w));
memset(s,0,sizeof(s));
for (int i=1; i<=m; i++) {
//tinh do cao
for (int j=1; j<=n; j++)
if ((a[i][j]>=A)&&(a[i][j]<=B)) h[j]++;
else h[j] = 0;
143

top = 0;
for (int j=1; j<=n+1; j++) {
if (h[j]>s[top]) {
top++;
s[top] = h[j];
p[top] = j;
continue;
}
while (s[top]>h[j]) {
w[i][s[top]] =
max(w[i][s[top]],s[top] * (j-p[top]));
top--;
}
if (h[j]>s[top]) {
top++;
s[top] = h[j];
}
}
// tinh cac do cao con lai
int sMax = 0;
for (int j=1; j<=i; j++) {
sMax = max(sMax, w[i][i-j+1] / (i-j+1));
w[i][i-j+1] = max(w[i][i-j+1],sMax*(ij+1));
}
}
for (int i=1; i<=m; i++)
for (int j=i; j>=1; j--) kq[j][i] = max (
kq[j+1][i], w[i][i-j+1]);
for (int i=1; i<=m; i++)
for (int j=i+1; j<=m; j++) kq[i][j] = max (
kq[i][j], kq[i][j-1]);
}
void truyVan() {
144

int q, i, j;
scanf("%d",&q);
for (int k=0; k<q; k++) {
scanf("%d%d",&i, &j);
printf("%d\n",max(kq01[i][j],kq12[i][j]));
}
}
int main() {
freopen("numtab.inp","r",stdin);
freopen("numtab.out","w",stdout);
docFile();
chuanBi(0,1,kq01);
chuanBi(1,2,kq12);
truyVan();
return 0;
}
3.6. Bi tp
3.6.1. Ct hnh
Cho mt bng s A gm M dng, N ct, cc gi tr ca bng A ch l 0
hoc 1. Ta mun ct bng A thnh cc hnh ch nht con sao cho cc hnh ch
nht con c gi tr ton bng 1 hay ton bng 0. Mt ln ct l mt nht ct
thng theo dng hoc theo ct ca mt hnh ch nht thnh hai hnh ch nht
ring bit. C tip tc ct cho n khi hnh ch nht ton bng 1 hay ton bng
0.
Yu cu: Hy tm cch ct c t hnh ch nht nht m cc hnh ch nht
con c gi tr ton bng 1 hay ton bng 0.
V d: Bng s 5x5 hnh bn
c chia thnh 8 hnh ch nht
con.

145

Input
- Dng u l 2 s nguyn dng M, N (M,N20)
- M dng tip theo, mi dng N s ch gm 0 hoc 1 th hin bng s A
Output
- Gm mt cha mt s duy nht l s hnh ch nht nhn c.
3.6.2. Tree Tiles
Bruce v Carl cng chi tr chi Tree Tiles nh sau:
- Carl s chn ra mt tp con cc loi hnh ca tp gm 5 loi hnh sau:

Loi 1
Loi 2
Loi 3
Loi 4
Loi 5
- Bruce s m s lng cch xp cc loi hnh m Carl chn ph kn
cy nh phn y su K.
V d mt cch ph bng loi hnh 1 v loi hnh 2

Yu cu: Cho bit cc loi hnh m Carl chn v s K, hy gip Bruce m s


lng cc xp cc loi hnh m Carl chn ph kn cy nh phn y
su K.
D liu vo trong file TILES.INP c dng:
- Dng 1: s nguyn dng K (
- Dng i (i=2..6): l s 0 khng chn loi hnh i hoc s 1 chn loi
hnh i.
Kt qu ra file TILES.OUT c dng: ghi s cch xp mod 1080
146

TILES.INP
3
1
1
0
0
0

TILES.OUT
5

Ch : C 50% s test: s cch xp khng vt qu


. Gii ng cc test
ny, th sinh c khng t hn 50% s im ti a cho ton b bi ton.
3.6.3. Nm bng
Xt chi tr chi nm bng nh sau:
Cho N ct xp thnh mt hng ngang ti cc v tr 1, 2,.., N. Chng ta c
loi bng c ny l w v c th nm hng sang bn tri hoc hng sang
bn phi. Nu nm bng vo v tr th i v hng sang bn phi th cc v tr i,
i+w, i+2w, nu c ct s b , nu nm bng vo v tr i v hng sang bn
tri th cc v tr i, i-w, i-2w, nu c ct s b . Nu nm ct i s c s
im l Ai im v ct s b loi b khi hng.
Yu cu: Hy tm cch nm bng khng vt qu B ln nm bng c
nhiu im nht. Nu c nhiu cch nm th tm cch nm vi s ln nm l t
nht.
D liu vo trong file nembong.inp gm nhiu test: Mi test c dng:
- Dng u l 3 s W, B, N (1 <= N <= 100; W,B > 0)
- Dng th hai gm N s m t mng A (| A[i] | <= 106)
Kt thc file l 3 s 0 cch nhau mt du cch
Kt qu ra file nembong.out c dng: gm nhiu dng, mi dng l p n
ca tng test tng ng vi file vo c dng: s im ln nht t c v s
ln nm bng.
Sample Input
2 3 10
-1 3 2 5 1 -2 0 5 1 -3
2 3 14
-1 3 2 5 -5 -5 1 -2 0 5 -5 -5 1 -3
3 3 5
-1 -2 -3 -4 -5
1 2 6
-1 -1 10 10 -1 -1
0 0 0
147

Sample Output
15 2
10 3
0 0
18 1

3.6.4. Ni im
Trn hai ng thng song song L1 v L2, ngi ta nh du trn mi ng N
im. Cc im trn ng thng L1 c nh s 1, 2, , N t tri qua phi,
cn cc im trn ng L2 c nh s bi D[1], D[2], , D[n] l mt hon
v ca N, cng c nh du t tri qua phi (hnh v di y cho mt v d
khi N = 9)
1-------2--------3--------4-------5------6------7------8------9

L1

2-------5--------3--------8-------7------4------6------9------1

L2

Ta c php ni hai im th i trn L1 vi im th j trn L2 nu ABS(iD[j])=1.


Yu cu: Tm cch ni c nhiu cp im nht vi iu kin cc on ni
khng c ct nhau.
Input
- Dng u tin cha s nguyn N (0<N<=105).
- Dng th 2 cha cc s D[1], D[2], , D[n].
Output
- Cha s K l s lng cp im ni tm c.
noidiem.inp
3
3 2 1

noidiem.out
2

3.6.5. Xu gn nht
Cho 3 xu X, Y, Z c di cng bng n cha cc k t t A n Z.
Ta nh ngha khong cch D(X,Y) gia hai xu X, Y l tng s cp k t tng
ng khc nhau trong hai xu, c th:
n

D( X , Y ) Di ( xi , yi ) trong Di ( xi , yi ) = 0 nu xi = yi; Di ( xi , yi ) = 1 nu
i 1

xi yi
V d: X = ABAB, Y = AAAB, Z = BBBB khong cch hai xu X
v Y l 1, khong cch hai xu Y v Z l 3.

148

Yu cu: Tm xu T sao cho khong cch ln nht ca T vi cc xu X, Y, Z l


nh nht.
D liu: Vo t file vn bn CSTR.INP gm 3 dng, mi dng cha mt xu,
di khng vt qu 100.
Kt qu: Ghi ra file vn bn CSTR.OUT xu cn tm. Nu c nhiu kt qu, a
ra xu c th t t in nh nht.
V d:
CSTR.INP
ABAB
AAAA
BBBB
3.6.6. Qun l kho
Cng ty XYZ c kho v
cc thng tin sau:

CSTR.OUT
AABB

nhn vin lm nhim v qun l cc kho. Cho bit

- Nhn vin th c nng lc


,
- Cc kho u ging nhau v mi kho ch do mt nhn vin qun l, nhng
mt nhn vin c th qun l nhiu kho. Nu nhn vin qun l kho
th an ton ca cc kho l
. Nu mt kho khng c ai
qun l th an ton bng 0,
- an ton ca tt c cc kho l bng an ton nh nht trong kho
- Mi thng cng ty s tr lng cho cc nhn vin, nu nhn vin c
chn th s phi tr
dollar. Tng s tin phi tr cho cc nhn vin
c chn l .
Yu cu: Chn v phn cng cc nhn vin qun l cc kho an ton ca
tt c cc kho ( ) l ln nht, nu c nhiu cch phn cng th chn cc ht t
tin nht ( ).
Input: QLKHO.INP
Gm nhiu b d liu (c khng qu 10 b), mi b d liu c dng:
o Dng 1: gm 2 s
o Dng 2: gm s
Kt thc file
Output: QLKHO.OUT
149

- Gm nhiu dng, mi dng gm 2 s


liu vo.
QLKHO.INP
2 1
7
1 2
10 9
2 5
10 8 6 4 1
5 4
1 1 1 1
0 0

l kt qu tng ng vi d

QLKHO.OUT
3 7
10 10
8 18
0 0

3.6.7. C phiu2
Hin nay th trng chng khon Vit Nam l mt knh huy ng vn hiu qu
cho cc doanh nghip cng nh l mt knh u t ti chnh tim nng cho cc
nh u t. Mt nh u t mun thc hin vic mua v bn c phiu ca n
cng ty tin hc c nim yt c phiu trn th trng trong giai on gm D
ngy.
Sau nhiu ngy phn tch, nh u t rt ra c cc d bo sau:
4.
S lng c phiu ca cng ty i (1 i n) trn th trng l Qi;
5.
Gi mt c phiu ca cng ty i trong ngy t l Pt,i (0 < Pt,i 106);
6.
kch thch giao dch, nh u t s khng mt ph giao dch.
Lut u t nh sau: Ti mt ngy t (1 t D) nh u t c th tin hnh hai
bc:

Bc 1 Bn c phiu: Nu c mi c phiu ca cng ty i trong ti


khon, nh u t c th tin hnh bn si (0 si mi) c phiu. S tin
bn c phiu (si Pt,i ) s c chuyn vo ti khon ca nh u t ngay
lp tc. S lng c phiu ca cng ty i trong ti khon ca nh u t
cn li l (mi si). Vi mi loi c phiu, nh u t c th bn hoc
khng bn c phiu.

Bc 2 Mua c phiu (thc hin sau khi tin hnh xong Bc


1): Nu mun mua si c phiu ca cng ty i, nh u t phi tr ngay lp
tc tin mua c phiu (v th mun thc hin giao dch ny, s tin trong
ti khon phi ln hn hoc bng s tin phi tr). S tin trong ti khon
ca nh u t ngay lp tc s b tr i mt lng l (si Pt,i ) ng. S
lng c phiu mua ngay lp tc s c chuyn vo ti khon ca nh
u t. Ch : tng s c phiu ca cng ty i trong ti khon ca nh u

150

t khng th ln hn Qi. Vi mi loi c phiu, nh u t c th mua


hoc khng mua c phiu.
Yu cu: Ti thi im u tin, nh u t c k ng trong ti khon, v
khng c c phiu ca bt c cng ty no. Da vo d bo nu trn, hy gip
nh u t tm cch mua bn c phiu t ngy th nht cho n ht ngy th D,
tng lng tin thu c l ln nht.
D liu: Vo t file vn bn STOCK2.INP:

Dng u cha 3 s nguyn dng n, k, D (n 3, k 109, D


104);

Dng th hai cha n s nguyn dng Q1, Q2,, Qn cho bit s


lng c phiu ca cc cng ty nim yt trn th trng (Qi 100, i = 1,
2,, n);

Dng th t trong D dng tip theo cha n s nguyn dng cho


bit gi c phiu ca n cng ty ti ngy t.
Cc s trn cng mt dng c ghi cch nhau bi t nht mt du cch.
Kt qu: Ghi ra file vn bn STOCK2.OUT mt s nguyn dng duy nht l
tng lng tin nh u t c c sau D ngy theo cch mua bn c phiu tm
c.
V d:
STOCK2.INP
2 1 2
1 1
1 1
2 3

STOCK2.OUT
3

3.6.8. Phn tch (ACMVN2011)


Cho mt s nguyn dng c dng
l
s nguyn t,
.
Ta gi
l mt cch phn tch ca s
ra tha s nu
l cc s nguyn dng v
. Hai cch phn tch
v
c gi l khc nhau nu tn
ti sao cho
vi
.
Yu cu: m s cch phn tch khc nhau thnh tch cc tha s.
V d,
ta c 4 cch phn tch nh sau:
Input
- Dng u l s

l s b d liu trong file,


151

dng sau, mi dng cha mt s nguyn dng


Output
- Gm dng, mi dng cha mt s l s cch phn tch khc nhau ca
tng b d liu tng ng vi d liu vo.
FACTOR.INP
2
30
100

FACTOR.OUT
4
8

Ch : 50% s test c
3.6.9. COMPUTER
Cng ty phn mm XYZ mi mua my tnh bn v my tnh xch tay.
Gi mt chic my tnh bn l a USD cn gi mt chic my tnh xch tay l
b USD. trnh s thc mc gia cc phng ban, Tng gim c a ra
cch phn b cc my tnh ny v phng ban nh sau:
Sp xp phng ban theo th t v mc quan trng ca cc
phng ban.
Tin hnh phn b cc my tnh cho cc phng ban bo m nu
phng ban c mc quan trng nh hn mc quan trng ca phng
ban th tng gi tr my tnh c phn b cho phng ban khng c
vt qu tng gi tr my tnh c phn b cho phng ban .
Phng ban nhn c tng gi tr my tnh nh nht l ln nht.
L mt lp trnh vin gii nhng li thuc phng ban c mc quan trng nh
nht, Khanh mun chng t tay ngh ca mnh vi ng nghip nn lp trnh
tnh ra ngay c tng gi tr my tnh m phng ban mnh nhn c ri mi
bn tnh li th xem!
Yu cu: Cho
. Hy tnh tng gi tr my tnh m phng Khanh nhn
c.
Input
Gm 2 b d liu, mi b trn mt dng, mi dng cha 5 s nguyn dng
(cc s c gi tr khng vt qu 1000)
Output
Gm hai dng l mi dng l p n tng ng vi b d liu vo.
COMPUTER.INP
COMPUTER.OUT
3 300 2 500 2
900
4 300 3 500 2
1300
Ch : 50% s test c

khng vt qu 100
152

3.6.10. ng i i xng trn li


Cho mt li vung gm dng v ct. Cc dng c nh s t 1 n
t trn xung di, cc ct c nh s t 1 n t tri qua phi. nm
v tr dng v ct ca li c gi l
v c ghi k t . Trn li
cho, t
ta c th di chuyn n
nu:
v
.
Yu cu: Xut pht t mt bt k, ta c th di chuyn qua cc ca li tun
theo qui tc di chuyn nu, tm cch di chuyn cc k t nhn c ln
lt trn cc i qua to thnh mt xu i xng di nht.
Input

Dng u tin ghi 2 s nguyn dng


.
Dng th trong s dng tip l mt xu di

m t li.

Output

S nguyn l s bc di chuyn nhiu nht c th trn li.


dng sau, mi dng l ta ln lt cc bc di chuyn.

PALPATH.INP
2 7
ioivnoi
vnoiioi

Gii hn: 1 m, n 50; aij

PALPATH.OUT
7
1 1
1 2
1 3
2 4
2 5
2 6
2 7
[a..z]

3.6.11. Tu chn (OlympicSV2009)


Cc hnh thc khuyn mi truyn thng phn no tr thnh nhm chn,
khng thu ht khch hng. Hy tng tng, nh bn c mt r USB
cc cc loi, vy m khi mua mt my tnh xch tay cc mt Macbook trng
lng 1250g vi gi 30 triu 500 ngn ng bn c nh nhn mi nhn
khuyn mi thm mt USB 4GB!
Siu th my tnh CMA (Computer Machine for All My tnh cho tt c mi
ngi) a ra mt phng thc khuyn mi mi va lch c cc qui nh
153

ca lut khuyn mi, va c sc thu ht ln, c bit l i vi gii tr sinh


vin.
Nu bn mua mt my tnh CMA gi t 8 triu 799 ngn ng tr ln, bn s
c cp mt m kha P s dng mt ln vn nng v mt s nguyn dng .
Bn c quyn truy nhp vo trang WEB CMA.Soft.com ca ca hng. Trang
WEB ny cha phn mm, nh s t 1 n . Mi phn mm c lu tr
di dng mt file ZIP v c bo v bng mt kha ring. Kha ny va
dng m nn file va dng ci t phn mm v ng k bn quyn s
dng. Kha thuc loi s dng mt ln: sau khi c dng m file v ci t,
kha s b v hiu ha. Trong mt vi file ZIP cn cha file DOC lu kha truy
nhp file ZIP khc.
Thng tin trn trang WEB cho bit gi ca mi phn mm v kha truy nhp
ca phn mm ny c gi file ZIP no. Bn c quyn m khng qu
file ZIP, ci t phn mm m c v s dng kha hoc nhng kha lu tr
file ny truy nhp ti cc file khc. Bn khng nht thit phi s dng ht cc
kha nhn c. Ban u vi kha vn nng P bn c th m mt file ZIP ty
chn bt k, ci t phn mm vo my ca mnh v dng cc kha lu tr
trong file ny truy nhp ti cc file khc. Gi tr my ca bn s tng thm
mt lng ng bng tng gi tr phn mm c ci t thm. Nu c cch la
chn s dng kha ng n, gi tr my tnh ca bn c th tng ln gp i
hay gp ba!
V d, vi

= 6,

=3 v thng tin v cc file ZIP nh sau:


File

Gi tr

Kha truy nhp ti


cc file

400

400

3 v 5

100

1000

150

750

Nu dng kha vn nng truy nhp vo file 2, bn c th ci t phn mm 2,


dng kha 3 nhn c truy nhp v ci t phn mm 3, sau dng kha 1
154

truy nhp v ci t phn mm 1. Tng gi tr phn mm ci t c l


400+100+400 = 900. Nhng nu lc u bn truy nhp vo file 1, ci t v
truy nhp tip n file 4. Bn ch ci c hai phn mm, nhng tng gi tr ca
chng s l 1400. C l bn s chn phng n sau, phi vy khng? Song
vn cha phi l cch c li nht!
Yu cu: Cho
, gi tr ca tng phn mm v kha km theo ti cc file
khc (nu c). Kha truy nhp ti mi file c lu gi khng qu mt ni.
Hy xc nh tng gi tr ln nht ca cc phn mm bn c th ci t vo my
ca mnh.
D liu: Vo t file vn bn OPTION.INP:
Dng u tin cha 2 s nguyn v
,
Dng th trong dng sau cha 2 s nguyn khng m v , trong

gi tr phn mm th ,
s lng kha lu tr
trong file th . Nu
th sau l
s nguyn dng khc
nhau tng i mt, mi s c gi tr khng vt qu l cc ch s ca
cc file c kha truy nhp c lu trong file th .
Cc s trn mt dng cch nhau mt du cch.
Kt qu: a ra file vn bn OPTION.OUT mt s nguyn tng gi tr ln
nht ca cc phn mm c th ci t.
V d:
OPTION.INP

OPTION.OUT

6 3

1500

400 1 4
400 2 3 5
100 1 1
1000 0
150 1 2
750 0

155

3.6.12. Binpacking
Mt x nghip c mt robot dng xp cc sn phm vo cc thng. Mi
thng u c dung tch nh nhau. C ng hai thng ang m sn robot
xp cc sn phm vo. Mi thng bt k u cha c s sn phm m tng
dung tch ca chng khng vt qu dung tch ca thng. Robot c th thc
hin cc thao tc sau:
1.
a mt sn phm hin ti trn dy bng vo thng 1,
2.
a mt sn phm hin ti trn dy bng vo thng 2,
3.
ng thng 1 v m mt thng mi thay th cho thng 1,
4.
ng thng 2 v m mt thng mi thay th cho thng 2.
Cc thao tc 1, 2 ch c th thc hin nu tng dung tch ca sn phm cho vo
v cc sn phm c trong thng khng vt qu dung tch ca thng.
Yu cu: Cho bit dung tch mi thng l L, dung tch ca N sn phm trn dy
bng theo th t xut hin l a1, a2,..., aN , hy tm s thng t nht c th
cho N sn phm vo thng.
Input

Output

Dng th nht l hai s nguyn L v N


Dng tip theo cha cc s m t cc s a 1, a2, ,aN

gm 1 s duy nht l s thng t nht cn dng.

Binpack.inp
8 6
4 2 5 3 5 4
Subtask 1

[10 tests]

Subtask 2

[10 tests]

Subtask 3

[10 tests]

Binpack.out
3

156

Subtask 4

[10 tests]

Subtask 5

[10 tests]

3.6.13. a gic khng t ct


Cho im trn mt phng, trong c t nht 3 im khng thng hng. T
cc im trong im trn ta c th dng c rt nhiu a gic khng t ct.
Trong bi ton ny s quan tm n cc a gic khng t ct v din tch ca
chng.
Yu cu: Cho im v s nguyn , hy tm t nht ba im v khng qu
im trong im trn, sau dng mt a gic khng t ct t cc im c
chn c a gic c din tch l ln nht.
D liu: Vo t file vn bn POLY.INP c dng:
Dng u cha hai s nguyn dng
(
)

dng sau, dng th gm 2 s nguyn


(| | | |
) l ta
im th (
.
Kt qu: a ra file vn bn POLY.OUT mt s thc vi 2 ch s sau du
chm l din tch a gic ln nht dng c.
V d
POLY.INP POLY.OUT
4 3
3.00
0 0
2 0
0 3
2 2
Ch : t nht 50% s im ng vi cc test c
3.6.14. Tp s (SP2012)
Cho s nguyn khng m n h c s 10, c khng qu 1000 ch s v khng
cha cc s 0 khng c ngha u. Bng cch xa mt hoc mt vi ch s
ca n (nhng khng xa ht tt c cc ch s ca n) ta nhn c nhng s
mi. S mi c chun ha bng cch xa cc ch s 0 v ngha nu c. Tp
s nguyn D c xy dng bng cch a vo n s n, cc s mi khc nhau
chun ha v khc n. V d, vi n = 101 ta c th nhn c cc s mi nh
sau:
Bng cch xa mt ch s ta c cc s: 1 (t 01), 11, 10;
157

Bng cch xa hai ch s ta c cc s: 1, 1, 0;


Tp D nhn c t n cha cc s {0, 1, 10, 11, 101}.
Yu cu: Cho s nguyn n v hai s nguyn khng m A, B. Hy xc nh s
lng s nm trong [A, B] c mt trong tp D c to thnh t n.
D liu: Vo t file vn bn NUMSET.INP c dng:
- Dng 1: cha s nguyn n, c khng qu 1000 ch s;
- Dng 2: cha s nguyn A, c khng qu 1000 ch s;
- Dng 3: cha s nguyn B, c khng qu 1000 ch s.
Kt qu: a ra file vn bn NUMSET.OUT mt s nguyn s lng s tm
c.
V d:
NUMSET.INP
NUMSET.OUT
101
3
1
100
Ch : 50% test n, A, B <1018
3.6.15. Thi u bp gii (VOIR2_2012)
BG2012 l cuc thi u bp gii do Lin hip hi cc khch sn du lch t
chc. Cuc thi c din ra trong khong thi gian t thi im A n ht thi
im B. Trong khong thi gian ny, mi th sinh tham gia cuc thi phi nu
ng n mn n, c nh s t 1 n n. Thanh l mt u bp k cu v quyt
tm ginh gii cao nht ca cuc thi ny. chun b tt nht cho cuc thi,
Thanh tnh c thi gian cn thit nu mn th i l ti n v thi gian v
nh gi mn n c mc quan trng l wi. D on l Ban gim kho s
i chm bi thi ca mnh vo khong thi im D, Thanh nh gi rng nu
mn n th i nu xong thi im fi th hp dn ca n s b gim mt lng:
|fi D|wi . t c kt qu cao, Thanh cn xy dng k hoch nu n mn n
sao cho tng lng gim hp dn ca tt c n mn n l nh nht. Bit rng,
ti mi thi im Thanh ch c th nu mt mn n v mi mn n phi c
nu lin tc t lc bt u cho n khi nu xong.
Yu cu: Cho bit s lng cc mn n n, thi gian thc hin nu n mn n t1,
t2, ..., tn v cc thi im A, B, D, hy xy dng k hoch nu n mn n sao cho
tng lng gim hp dn ca n mn n l nh nht.
D liu: Vo t file vn bn DBG2012.INP:

158


Dng u tin cha bn s nguyn n, A, B v D (1 n 1000, 0
A D B 10000);

Dng th i trong s n dng tip theo cha 2 s nguyn ti v wi l


thi gian cn thit nu mn n i v mc quan trng ca n (0 < ti, wi
100, i = 1, 2, ..., n; t1+ t2+...+ tn B A).
Hai s lin tip trn cng dng c ghi cch nhau bi du cch.
Kt qu: Ghi ra file vn bn DBG2012.OUT tng lng gim hp dn ca n
mn n theo k hoch tm c.
V d:
DBG2012.INP

DBG2012.OUT

3 0 100 50

130

Hnh v minh ho
Mn 2

20 2
0

40 3
30 2

159

Mn 1
40

50

Mn 3
60

90

CHUYN 4
CY HU T V MT S NG DNG TRONG X L XU

Cy hu t l mt cu trc d liu biu din cc hu t ca mt xu, c


ng dng rng ri trong cc thut ton x l xu bi n cung nhiu php ton
hiu qu gip lm gim thi gian thc hin gii thut. Mt cu trc d liu
dn xut l mng hu t tuy phm vi ng dng hp hn cy hu t nhng li
rt n gin trong ci t. Tn dng nhng u im ca c hai cu trc d
liu , rt nhiu thut ton hiu qu c cng b trong nhng nm gn
y. Chuyn ny gii thiu mt s thut ton xy dng cy hu t v
mng hu t cng vi mt s bi ton c bn m thut ton gii quyt chng
l nhng v d in hnh ca vic ng dng hai cu trc d liu ny. Bn cnh
, chuyn cng trnh by mt s m rng v tho lun v kinh nghim ci
t trong cc k thi lp trnh vi thi gian hn ch.

4.1. Gii thiu


Cy hu t (suffix trees) l mt cu trc d liu quan trng c s dng trong
rt nhiu thut ton x l xu. Sc mnh ca cy hu t nm kh nng biu
din tt c cc hu t ca mt xu v cung cp nhiu php ton quan trng gip
nng cao tnh hiu qu ca nhng thut ton. Chnh nh nhng tnh cht m
cy hu t c s dng trong rt nhiu lnh vc khc nhau nh: x l vn bn,
trch chn v tm kim thng tin, phn tch d liu sinh hc, i snh mu v.v
Bn cnh u im l mt cu trc d liu mnh, cc thut ton trc tip xy
dng cy hu t c nhc im l phc tp v tn b nh. Mng hu t (suffix
arrays) l mt cu trc d liu dn xut t cy hu t v l mt s thay th hp
l cho cy hu t trong mt s ng dng c th. Xt v tnh nng, mng hu t
khng h tr nhiu php ton nh cy hu t nhng li c th ci t kh d
dng.
Mc d mng hu t l cu trc d liu dn xut v c th xy dng t cy hu
t tng ng, c rt nhiu thut ton c th xy dng mng hu t mt cch
trc tip m khng cn dng n cy hu t. Nhng thut ton nh vy cho
php n gin ha rt nhiu thao tc x l xu, bi trong trng hp c th s
dng mng hu t gii quyt, ta khng cn bit v khi nim cy hu t na.
Cng t khi c nhng thut ton trc tip v hiu qu xy dng mng hu t, rt
nhiu nghin cu tm ra phng php xy dng theo chiu ngc li: Dng
160

cy hu t t mng hu t. Nhng phng php ny c u im l nhanh v tit


kim b nh hn so vi php xy dng trc tip cy hu t. Ngoi ra, nhng
phng php ny cn cung cp nhiu k thut hay trong x l d liu, c th k
tha ng dng trong nhng lnh vc khc.
Trong cc phn tip theo ca chuyn , phn 4.2 gii thiu cc khi nim c s
v trie hu t, cy hu t, mng hu t v mng tin t chung di nht. Phn 4.3
trnh by mt s thut ton xy dng mng hu t v cy hu t. Phn 4.4 nu
mt s bi ton c bn cho thy hiu qu ca vic ng dng cu trc d liu
mng hu t v cy hu t. Cui cng l kt lun v mt s m rng ca cu
trc d liu.
4.2. Mt s khi nim c s
Gi l mt tp hu hn c th t gi l bng ch ci (alphabet), cc phn t
c gi l k t.
l tp cc xu (string) gm cc k t
. C th coi
mi xu
l mt dy hu hn cc k t
. K hiu l xu rng, tp cc
xu khc rng c gi l
.
Chiu di ca mt xu , k hiu | |, l s k t trong xu . Cc k t trong
xu c nh s t 1 ti | |:
| |.
Xu ni ca hai xu v , k hiu , c chiu di | | | | v to thnh bng
cch ly cc k t trong sau ni tip vi cc k t trong .
Ta gi xu l tin t (prefix) ca xu , k hiu
, nu tn ti xu
, xu c gi l hu t (suffix) ca xu , k hiu
, nu tn ti
xu
. D thy rng nu l tin t hoc hu t ca th | | | |.
Mt xu c th va l tin t va l hu t ca mt xu khc. V d ABA va l
tin t va l hu t ca xu ABABA. Xu rng va l tin t, va l hu t
ca tt c cc xu.
Hai quan h
Nu
Nu

c tnh bc cu, tc l:
v
v

th
th

.
.

B 1 (v tnh gi nhau ca cc tin t v cc hu t)


Nu v
| | | |,

cng l tin t ca mt xu th
s l tin t ca nu | | | |.
161

s l tin t ca

nu

Nu v
| | | |,

cng l hu t ca mt xu th
s l hu t ca nu | | | |.

s l hu t ca

nu

Vic chng minh B 1 kh hin nhin: Hai tin t ca cng mt xu c quan


h tin t v hai hu t ca cng mt xu c quan h hu t.
Cho
v
trong xu ti v tr nu
xu mt v tr no th

l hai xu k t, ta ni xu xut hin


. Nu xu xut hin trong
l xu con (substring) ca .

C th coi xu con ca mt xu l mt dy cc k t lin tip trong . Mt


cch nh ngha khc v xu con ca l mt tin t ca mt hu t ca .
B

Hu t

: Tin t ca mt hu t

Hnh 1. Xu con = tin t ca mt hu t

Trong cc v d ca chuyn ny, ta coi tp ch ci l tp 26 k t hoa ting


Anh: t A n Z cng thm mt k t cm canh k hiu @. Th t ca cc
k t ging nh trong cc bng m thng dng ANSI/ASCII/Unicode: K t
@ l k t u tin trong bng ch ci , tip theo l cc k t t A n Z.
4.2.1. Trie hu t
Cho l mt tp gm xu khc rng tha mn: khng xu no l tin t ca
mt xu khc. Trie1 [3] ca tp l mt cu trc d liu dng cy biu din cc
xu
Mi cnh ca cy c nhn l mt k t
. Cc cnh i t mt nt xung
cc nt con ca n phi mang cc nhn hon ton phn bit.
Mi nt trn trie cng mang mt nhn, nhn ca nt , k hiu l xu
to thnh bng cch ni tip cc k t nhn cnh trn ng i tr gc
xung nt . Chiu di ca xu : | | c gi l su ca nt , k hiu
. Theo cu trc ca trie, hai nt khc nhau phi c xu nhn khc
nhau.

Trie l thut ng ly t retrieval, c pht m l /tri/ ging nh tree hoc /tra/ ging nh try

162

C tng ng 1-1 gia cc xu


v mi l c nhn l mt xu
.

vi cc nt l trn trie: trie c ng

Hnh 2 l trie biu din 8 xu: BEAR, BELL, BID, BULL, BUY, SELL,
STOCK, STOP

BID

BUY

BEAR

BELL

BULL

SELL

P
STOP

STOCK

Hnh 2. Trie

Cc xu trong tp phi tha mn tnh cht phi tin t (prefix-free): khng c


xu no l tin t ca mt xu khc, khng th xy dng c trie biu din tp
nu iu kin ny b vi phm. Tht vy, gi s
, nu ta xy
dng trie biu din c xu ABC, tc l c nt l mang nhn ABC. Trn
ng i t gc xung l, ta s i qua ln lt cc nt c nhn l , A, AB,
ABC. C nt nhnh ca trie mang nhn AB, tc l khng th c nt l ca trie
mang nhn AB c na (Hnh 3 a)).
Tnh cht phi tin t l mt iu kin quyt nh xy dng trie, hu ht
nhng thut ton da trn trie u phi rng buc tnh cht ny ca d liu (in
hnh l thut ton m ha Huffman). Mt trong nhng k thut m bo d
liu c tnh phi tin t l b sung mt k t ng u bng ch ci lm k t
cm canh m ta k hiu l @: mi xu
s c ni thm k t @ vo cui
xu m bo khng c xu no l tin t ca mt xu khc. Hnh 3 b) l v
d v trie biu din tp gm hai xu: ABC@ v AB@. C th thy rng khi
s dng k t cm canh th mi cnh trn trie ni ti nt l u mang nhn @.

163

AB
@

C
ABC

AB@
@

a)

b)

ABC@

Hnh 3. Vai tr ca k t cm canh @

Nu l tp cc hu t khc rng ca mt xu
th trie biu din c
gi l trie hu t (suffix trie) ca . tha mn tnh cht phi tin t ca tp ,
ta coi xu c mt k t cm canh @ ng cui cng cn mi k t khc trong
u khng phi k t @. V d nu l xu BANANA@, tp cc hu t
khc rng ca gm c 7 xu:
BANANA@
ANANA@
NANA@
ANA@
NA@
A@
@

Trie hu t ca xu BANANA@ c th biu din nh trong Hnh 4.

164

Hnh 4. Trie hu t

C th k ra mt vi v d s dng trie hu t ca xu :
kim tra xu
c phi l xu con ca xu hay khng, ta xt
gc trie v xt ln lt cc k t trong : Mi khi xt qua k t th r sang
nhnh con theo cnh c nhn l . Nu ti mt bc no vic chuyn xung
nhnh con tht bi do khng tm c cnh c nhn tng ng th khng l
xu con ca , ngc li nu qu trnh di chuyn kt thc mt nt no
trn trie th l xu con ca v s nt l trong nhnh trie gc chnh l s
ln xu xut hin trong xu . V d nu
v
, xt trie
trong Hnh 4, t gc ta di chuyn theo cnh A ri sau theo cnh N, dng
li mt nt nhnh. Trong nhnh con ny c 2 nt l (ng vi hai hu t)
ANA@ v ANANA@ v vy xu AN xut hin trong xu BANANA@ ng
hai ln. Tnh ng n ca thut ton c th suy ra mt cch trc tip: xu con
ca mt xu l tin t ca mt hu t ca . iu ng ch y l khi
c trie hu t biu din , thi gian thc hin gii thut kim tra c phi xu
con ca hay khng l | | , khng ph thuc vo chiu di xu . iu ny
thc s hu ch khi ta lin tc phi tm kim nhng ch mc t khc nhau trong
mt vn bn c th rt di.
Mt v d khc s dng trie hu t l tm xu con lp di nht (xu con xut
hin trong nhiu hn 1 ln), vic ny c thc hin rt n gin trn trie:
Tm nt su nht m nhnh cy gc c t nht 2 l, khi chnh l xu
165

con lp di nht. Nh v d Hnh 4, nt nhnh su nht chnh l nt c nhn


ANA. C th m rng tm xu con lp bc di nht (xu con xut hin trong
t nht ln): Thut ton ch n gin l tm nt su nht m nhnh cy gc
c t nht l, chng hn vi xu
trong Hnh 4 th xu lp bc
2 di nht l ANA, xu lp bc 3 di nht l A.
Mc d trie hu t h tr kh nhiu php ton hiu qu trn xu, vic xy dng
trie hu t t ra kh tn thi gian v b nh: Trong trng hp xu nht, vic
| | nt v mt thi gian
xy dng trie hu t ca xu
cn cp pht
| | . C th ly v d v trie hu t ca xu
(xu gm k t
A, tip theo l k t B v kt thc bi k t cm canh @), trie ny c
nt (Hnh 5).

Hnh 5. Trie hu t ca xu AABB@ c 14 nt

4.2.2. Cy hu t
Cy hu t (suffix trees) cng l mt cu trc d liu biu din cc hu t ca
mt xu khc rng vi c ch tng t nh trie. Cy hu t c to thnh t
trie hu t bng cch chp cc nt con n nhnh lin tip li thnh mt nt con
duy nht v ly dy cc nhn cnh b chp thnh mt xu biu din nhn cnh.
Chnh xc hn, cy hu t ca mt xu
d liu dng cy c cc tnh cht sau:

, k hiu

l mt cu trc

Mi cnh ca cy c nhn l mt xu
. Cc cnh i t mt nt xung
cc nt con ca n phi mang nhn l cc xu c k t u tin hon ton
phn bit.

166

Mi nt trn cu hu t cng mang mt nhn, nhn ca nt , k hiu l


xu to thnh bng cch ni tip cc nhn cnh trn ng i tr gc xung
nt . Chiu di ca xu : | | c gi l su ca nt , k hiu
. Theo cu trc ca cy hu t, hai nt khc nhau phi c xu nhn
khc nhau.
Ngoi tr nt gc, khng nt no trn cy hu t c 1 nt con.
C tng ng 1-1 gia cc hu t ca vi cc nt l trn
:
c
ng | | l v mi l c nhn l mt hu t ca .
@

NA

BANANA@

NA

NA@

NA@

Hnh 6. Cy hu t

Hnh 6 l v d v cy hu t ca xu BANANA@. B 2 ch ra chi ph b


nh ca mt cy hu t khi biu din xu.
B 2
Cy hu t ca mt xu di

c khng qu

nt

Chng minh
Gi s cy hu t c
nt nhnh tc l c tng cng
nt. Ta bit rng
s cnh ca cy bng
v tng s con ca tt c cc nt trn cy ng
bng s cnh trn cy. Cc nt l trn cy c s con bng 0, cc nt nhnh ngoi
tr nt gc c s con
, nt gc c t nht 1 con. V vy tng s con ca tt c
cc nt trn cy khng th nh hn
, t ta c
hay
, tc l cy hu t c khng qu nt nhnh v tng cng c khng
qu
nt.
Mc d cy hu t c pht kin t rt sm, nhng nghin cu trn cy hu t
li c xy dng t nhiu nghin cu c lp trong nhng lnh vc khc nhau
vi cu trc cy c mt s khc bit. Khi tm kim nhng ti liu lin quan ti
cy hu t, ta c th bt gp nhiu tn gi khc nhau nh suffix trees,

167

compacted bi-trees, prefix trees, PAT trees, position trees, repetion


finder, subword trees,
Cy hu t c gii thiu ln u tin bi Morrison vi tn gi cy PATRICIA
[14]. Tuy vy Weiner mi l ngi chun ha cu trc cy hu t (di tn gi
compacted bi-trees) v a ra thut ton tuyn tnh xy dng cy [3], thut ton
ny sau c Donald Knuth bnh chn l thut ton ca nm 1973. Tip
theo nghin cu ca Weiner, cc thut ton tuyn tnh xy dng cy hu t lin
tc ci tin v n gin ha, chng hn nh thut ton ca McCreight nm 1976
[13], ca Slissenko nm 1983 [16]. Nhng thut ton tuyn tnh u tin c th
lm vic trc tuyn c xut bi Kosaraju nm 1994 [11] v Ukkonen nm
1995 [17], cc thut ton ny c kh nng xy dng cy hu t bng cch c
tng k t trong xu ngun t tri qua phi, chnh v vy n thch hp khi mun
xy dng cy hu t bng cch nhn tng tn hiu trn ng truyn.
Bn cnh vic xut cc thut ton xy dng cy, cc nghin cu cng a
ra thm rt nhiu ng dng ca cy hu t, c bit trong lnh vc x l vn bn
v d liu sinh hc. Tuy nhin, c hai nhc im chung ca cc phng php
xy dng cy hu t trc tip, l:
Cc thut ton c th thc hin trong thi gian tuyn tnh v s dng b nh
tuyn tnh, nhng c mt hng s ln n trong k php nh gi phc
tp tnh ton. Trn thc t chng trnh ci t thut ton xy dng cy hu
t kh chm v tn b nh.
Mc d c nhiu c gng n gin ha thut ton nhng cho ti nay,
cc m hnh ci t nhng thut ton trn vn cn rt phc tp v d nhm
ln.
4.2.3. Mng hu t
Cho mt xu
(suffix array) ca , k hiu

, quy c c duy nht


. Mng hu t
l th t t in ca tt c cc hu t ca .

Mi hu t
c th c ng nht vi v tr , khi mng hu t ca xu
c th biu din nh l mt hon v
ca dy s
sao cho:

( y ta dng k hiu < cho th t t in ca cc xu, nu


phi ng trc xu theo th t t in)
168

tc l xu

V d vi xu
, cc hu t ca
tng ng c ch ra trong Hnh 7.
1

Th t t in

v mng hu t

Mng hu t

Hnh 7. Mng hu t

Mng hu t
ca xu di c th xy dng trc tip t cy hu t
trong thi gian
. Thut ton c th m t nh sau:
Quy nh th t cc nt con ca mt nt: Theo th t t in, nt con ng
vi cnh mang nhn nh hn s ng trc nt con ng vi cnh mang
nhn ln hn. V cc xu nhn ca cc cnh i xung t mt nt phi c k
t u tin khc nhau, th t t in ca cc cnh n gin l th t tng
dn ca k t u tin trong cc nhn cnh.
Duyt cy bng DFS bt u t gc, khi thm ti mt nt ta ln lt thm
cc nt con ca n theo th t quy nh. Khi danh sch cc nt l theo
th t thm s ng vi danh sch cc hu t lit k theo th t t in (Hnh
8).

169

NA

BANANA@

NA

A@

ANA@

NA@

NA@

ANANA@

BANANA@

NA@

NANA@

Hnh 8. Cy hu t v mng hu t

Mng hu t c xut bi Manber v Myer [12] nh mt s thay th cho


cy hu t trong mt s bi ton x l xu. u im chnh ca mng hu t l
tnh n gin trong cu trc v s tit kim b nh trong biu din. Manber v
Mayer cng xut thut ton xy dng mng hu t trc tip m khng phi
s dng cy hu t gi l thut ton nhn i tin t (doubling prefix). Mc d
thut ton c thi gian thc hin
trong trng hp xu nht, trung
bnh thut ton ch cn thi gian
xy dng mng hu t ca xu di
.
Cng c rt nhiu n lc tm kim thut ton hiu qu hn xy dng mng
hu t. Nm 2003, hai nghin cu c lp ca Krkkinen [7] v Ko [10] tm
ra c hai thut ton tuyn tnh xy dng mng hu t. Mt im ng ch
trong cc thut ton ca Krkkinen v Ko l chng u da trn nhng nhn
nh rt tinh t v tnh cht ca cc hu t v mi quan h gia cc v tr trong
xu. Vic ph b c ro cn
trong trng hp xu nht m ra
mt tim nng mi cho vic s dng mng hu t m cc nghin cu tip sau
s dng xy dng cy hu t t mng hu t m khng lm tng phc tp
tnh ton ca gii thut.
4.2.4. Mng tin t chung di nht
Tin t chung di nht (longest common prefix) ca hai xu
l xu c
di ln nht tha mn: va l tin t ca va l tin t ca . V d tin t
chung di nht ca SUFFIXTRIE v SUFFIXTREE l xu SUFFIXTR.
Cho
hu t ca

l mt xu khc rng,
. Mng tin t chung di nht
nh ngha nh sau:
170

l mng
l dy s nguyn

;
:
t ti v tr

l di tin t chung di nht gia hu t ti v tr


trong xu

V d vi xu

, mng hu t ca

v hu

, ta c:

;
( di tin t chung di nht ca A@ v @)
( di tin t chung di nht ca ANA@ v A@)
( di tin t chung di nht ca ANANA@ v ANA@)
( di tin t chung di nht ca BANANA@ v ANANA@)
( di tin t chung di nht ca NA@ v BANANA@)
( di tin t chung di nht ca NANA@ v NA@)
Bn cht ca mng tin t chung di nht c th phn tch trn cu trc ca cy
hu t. Vi hai hu t ca xu ng vi hai l trong
, tin t chung di
nht ca hai hu t l nhn ca nt tin bi chung thp nht (lowest common
ancestor-LCA) ca hai nt l , su ca nt tin t chung thp nht l di
ca tin t chung di nht gia hai hu t. Hnh 9 l v d v tin t chung di
nht ca hai hu t A@ v ANA@, tin t ny ng vi nt mang nhn A.
Nhc li l su ca mt nt trn cy hu t l di nhn ca nt, khng
phi s cnh trn ng i t gc xung nt, ta c th ly v d v tin t chung
di nht gia ANA@ v ANANA@ trong Hnh 9.

NA

BANANA@

A@

NA

NA@

NA@

ANA@

Hnh 9. Tin t chung di nht gia hai hu t l nhn ca nt tin bi chung thp nht.

171

Trn cy hu t, c rt nhiu thut ton LCA c th p dng tm nt tin bi


chung gn nht ca hai nt, mi truy vn LCA c thc hin trong thi gian
v v th c th xy dng mng tin t chung di nht trong thi gian
. Mc d vy, Kasai [8] xut c thut ton tuyn tnh ht sc n
gin v hiu qu xy dng mng tin t chung di nht t mng hu t.
4.3. Cc thut ton xy dng cu trc d liu
Cc thut ton trong chuyn ny s c gii thiu theo th t sau: Trc
tin l nhng thut ton xy dng mng hu t
tip theo l thut ton xy
dng mng tin t chung di nht
, vi mc ch cui cng l thut ton
xy dng cy hu t
t
v
.
4.3.1. Xy dng mng hu t
trong duy nht
:

Bi ton: Cho xu
dng mng hu t

. Cn xy

Mc d mng hu t n gin l th t t in ca cc hu t, vic p dng cc


thut ton sp xp da trn php so snh xu khng phi l mt phng php
hay bi php so snh hai xu theo th t t in trong trng hp xu nht s t
l thun vi chiu di xu. Hu ht cc thut ton hiu qu u phi thc hin
trn ch s v ch dng cc php ton trn k t. Trong chuyn ny, ta ng
nht mi hu t vi v tr k t u tin trong xu , tc l nu
th
hu t l
.
4.3.1.1. Thut ton nhn i tin t
Cho xu
. Phng php c in nht xy dng trc tip mng
hu t
m khng cn dng cy hu t c tn l
thut ton nhn i tin t, c xut bi Manber v Myers [12]. Thut ton
ny cho n nay vn c s dng ph bin trong cc k thi lp trnh bi hai l
do:
Vic ci t thut ton kh n gin, thch hp vi vic lp trnh trong thi
gian hn ch.
Mc d trong trng hp xu nht, thut ton cn thi gian

xy dng mng hu t, nhng trung bnh thut ton ch cn mt thi gian


thc hin trong trng hp d liu c phn b ngu nhin trong
mt bng ch ci ln.
172

tng ca thut ton nh sau:


Khi to: Sp xp cc hu t ca theo th t tng dn ca k t u tin. iu
ny tng ng vi vic sp xp cc k t trong theo th t tng dn. Sau
] tha mn: Hai hu t c
ta gn cho mi hu t mt kha s nguyn [
k t u bng nhau phi mang kha bng nhau, hai hu t c k t u khc
nhau phi mang hai kha khc nhau v hu t no c k t u nh hn phi
mang kha nh hn. Vic gn kha s mt thi gian
. Kha s l i din
cho k t ng u ca cc hu t, tc l dy cc hu t xp theo th t tng
dn ca kha s cng l dy cc hu t theo th t tng dn ca k t u tin.
Phn chnh ca thut ton c thc hin lp qua nhiu pha, ti mt pha, gi
thit l c dy cc hu t xp theo th t tng dn ca k t u cng cc
kha s tng ng vi th t sp xp, thut ton s xy dng dy cc hu t xp
theo th t tng dn ca
k t u v dy kha s mi tng ng:
Gi cc kha ang gn cho cc hu t l cc kha s cp (primary keys),
mi hu t s c b sung mt kha na gi l kha th cp (secondary
keys). Kha th cp ca mt hu t (
chnh bng kha s cp ca hu
t ng sau n
v tr trong xu
(hu t
hoc bng 0 nu
.
Sp xp li cc hu t theo quy tc: Trc tin xp tng dn theo kha s
cp, nu hai hu t c kha s cp bng nhau th hu t no c kha th cp
nh hn s c xp trc. Theo gi thit v dy kha s cp v cch xy
dng dy kha th cp, ta s thu c dy cc hu t xp theo th t tng
dn ca
k t u sau khi sp xp (khi hai hu t c k t u khp
nhau th k t sau s c dng quyt nh hu t ny ng trc).
Vi cc hu t sp xp, mi hu t s c gn kha s mi: Hu t
ng u dy c nh s 1. Bt u t hu t th hai tr i trong dy, nu
n c c kha s cp v th cp ging vi hu t lin trc th kha s mi
ca n bng kha s mi ca hu t lin trc, nu khng th kha s mi
ca n bng kha s mi ca hu t lin trc cng thm 1. Thao tc gn
kha s mi mt thi gian
.
Nh vy cc bc lp ln lt xy dng c th t ca cc hu t xp theo 2,
.
4, 8, 16, 32, k t u tin. Mng hu t s thu c sau bc lp th
Thut ton c th dng sm ti mt bc lp no m tt c cc kha gn cho
cc hu t l cc s nguyn hon ton phn bit t 1 ti (cc bc lp sau
chc chn khng cn thay i th t sp xp na).
173

Thi gian thc hin gii thut ph thuc vo thut ton sp xp theo hai dy
kha s ti mi bc. C th dng cc thut ton sp xp so snh, chng hn
nh QuickSort. Tuy nhin v tp cc gi tr kha l cc s nguyn nm trong
phm vi t 1 ti , ta c th p dng cc thut ton sp xp c s (Radix Sort)
hoc m phn phi (Counting Sort) t tc cao hn vi thi gian thc
hin gii thut sp xp l
T thut ton nhn i tin t c th thc
hin trong thi gian
.
Ci t
ci t thut ton nhn i tin t c n gin v hiu qu, ta cn a ra
mt vi nhn xt c phng php t chc d liu hp l.
Xt hon v vng quanh
ca xu ti v tr . Hon v vng
quanh ny l ghp ca hu t
vi tin t
. C th coi hon
v vng quanh c to thnh bng cch vit cc k t trong quanh mt vng
trn theo chiu kim ng h ri ly k t lin tip theo chiu nh bt u
t v tr . Vi vic s dng k t cm canh @, th t t in ca cc hu t ca
cng l th t t in ca cc hon v vng quanh tng ng. iu ny c th
suy ra c v k t @ l k t nh nht trong bng ch ci v k t ny ch
xut hin mt ln cui xu . Bng di y l th t in ca cc hu t
cng nh hon v vng quanh ti cng v tr.
B
@

N
N

Hu t
@
A@
ANA@
ANANA@
BANANA@
NA@
NANA@

Hon v vng quanh


@BANANA
A@BANAN
ANA@BAN
ANANA@B
BANANA@
NA@BANA
NANA@BA

Bng vic s dng hon v vng quanh, khi nim v tr ng trc/sau bc


so vi v tr lun tn ti trn vng trn nn ta khng cn phi x l trng hp
ring khi mt v tr khng tn ti trong dy.
ng nht mi hon v vng quanh vi v tr ca k t ng u. Gi s u
mi pha lp, ta c dy
l dy cc hon v vng quanh xp
theo th t t in ca k t u tin. Gi k t u tin ca mi hon v
vng quanh l on s cp v k t tip theo on s cp l on th cp.

174

Xy dng dy
nh sau:
l v tr ng trc bc so vi
trn vng trn. y chnh l dy hon v vng quanh xp theo th t t in
ca on th cp.
on s cp ca mi hon v vng quanh c gn kha s ng vi th t t
in. V vy nu ta sp xp li dy
theo th t tng dn ca
kha s bng mt thut ton sp xp n nh (chng hn nh thut ton m
phn phi) c dy
mi th y chnh l th t t in
ca cc hon v vng quanh theo
k t u tin. Tht vy, trong thut ton
sp xp n nh, hai hon v vng quanh c on s cp ging nhau th hon v
no ang ng trc vn s ng trc, tc l hon v no c on th cp nh
hn s ng trc.
[
]
tin li cho vic gn kha s, ta c thm mng boolean
[ ] s c t bng True nu
nh du. Sau mi pha lp,
phi mang
[]
kha s khc vi
. Nu trc pha lp
tc l
c kha
s cp khc vi
th sau bc lp
vn mang kha s cp khc
[]
, ta ch t thm
nu sau pha lp
mang kha th cp
khc vi
;
Di y l on chng trnh tnh mng hu t theo thut ton nhn i tin t
Input:
Xu gm khng qu
cui xu

, k t @ ch xut hin 1 ln

k t

Output
Mng hu t ca
Sample Input
BANANA@

Sample Output
7 6 4 2 1 5 3

SUFFIXARRAY.PAS Tnh mng hu t

{$MODE OBJFPC}
program SuffixArrayConstruction;
const
maxN = 100000;
type
TAlphabet = '@'..'Z';
var

175

T: AnsiString;
n: Integer;
key, head, sa, sb: array[1..maxN] of Integer;
mark: array[1..maxN] of Boolean;
procedure Init; //Khi to
var
i: Integer;
c: TAlphabet;
ccount: array[TAlphabet] of Integer;
begin
//Thut ton m phn phi, to dy sa[1n] l cc hon v vng quanh xp theo ch ci u

FillChar(ccount, SizeOf(ccount), 0);


for i := 1 to n do Inc(ccount[T[i]]);
for c := Succ(Low(TAlphabet)) to High(TAlphabet) do
Inc(ccount[c], ccount[pred(c)]);
for i := n downto 1 do
begin
c := T[i];
sa[ccount[c]] := i; Dec(ccount[c]);
end;
//Khi to mng mark[1n]

mark[1] := True;
for i := 2 to n do mark[i] := T[sa[i]] <> T[sa[i - 1]]; //sa[i] phi mang kha khc
sa[i-1]

end;
procedure SuffixArray; //Thut ton nhn i tin t
var
i, j, maxkeyvalue, keyvalue: Integer;
k: Integer;
begin
k := 1;
while k < n do
begin
//Trc mi pha lp c sa[1n] l dy cc HVVQ xp theo on s cp gm k k t u
//Da vo mng mark tnh cc gi tr kha s cp v to sb[1n] l dy cc HVVQ xp theo on th cp

maxkeyvalue := 0;
for i := 1 to n do
begin
if mark[i] then Inc(maxkeyvalue);
key[sa[i]] := maxkeyvalue;
sb[i] := sa[i] - k; //sb[i] = hvvq ng trc v tr i ng k bc
if sb[i] < 1 then Inc(sb[i], n); //nh x ch s trn vng trn
end;
if maxkeyvalue = n then Break; //Nu cc kha s cp hon hon phn bit th xong
//Thut ton m phn phi xp n nh dy sb[1n] theo kha s cp thu c sa[1n] mi

FillDWord(head, maxkeyvalue, 0);


for i := 1 to n do Inc(head[key[sb[i]]]);
for keyvalue := 2 to maxkeyvalue do

176

Inc(head[keyvalue], head[Pred(keyvalue)]);
for i := n downto 1 do
begin
keyvalue := key[sb[i]];
sa[head[keyvalue]] := sb[i]; Dec(head[keyvalue]);
end;
//sa[1n] gi l dy hvvq xp theo 2k k t u, cp nht li mng mark

keyvalue := 0;
for i := 1 to n do
begin
j := sa[i] + k; //j ng sau sa[i] ng k bc, key[j] l kha th cp ca sa[i]
if j > n then Dec(j, n); //nh x ch s trn vng trn
if key[j] <> keyvalue then //key[j] = kha th cp ca sa[i] khc vi kha th cp ca
sa[i-1]

begin
mark[i] := True; //t mark nh du
keyvalue := key[j];
end;
end;
end;
end;
procedure PrintResult; //In kt qu
var
i: Integer;
begin
for i := 1 to n do Write(sa[i], ' ');
WriteLn;
end;
begin
ReadLn(T); n := Length(T);
Init;
SuffixArray;
PrintResult;
end.

4.3.1.2. Thut ton chia tr


Mt trong nhng k thut quan trng c dng trong thut ton nhn i tin
t l thay th vic so snh xu bi php so snh s nguyn. K thut ny gi
l m ha (encoding) bng kha s.
xy dng mng hu t, cn c hai thut ton khc c pht trin c lp
nhng u da trn k thut chia tr v c ch m ha bng kha s. Tuy
cch tip cn c khc nhau nhng chng u l cc thut ton tuyn tnh (c v

177

thi gian v b nh). Ngoi vic lp y khong trng l thuyt2, nhng th


nghim trn d liu thc t cng cho thy u im r rt ca nhng phng
php ny so vi thut ton nhn i tin t khi x l d liu ln.
Thut ton ca Krkkinen v Sanders (2003) [7]: Ti mi bc, hai phn ba s
hu t s c m ha theo 3 k t u v c sp xp bng quy, mt phn
ba cn li c sp da vo th t t in ca s hu t sp sau trn kt
qu li. Kch thc d liu gim xung cn
sau mi bc lp. Thi gian
thc hin gii thut l

( )

Thut ton ca Ko v Aluru (2003) [10]: Ti mi bc, cc hu t c phn


lm hai loi: Loi l cc hu t ti v tr m nh hn hu t ti v tr
v
loi l cc hu t ti v tr m ln hn hu t ti v tr
. Cc tc gi
chng minh c rng ch cn sp xp c mt trong hai loi th ch cn mt
thut ton tuyn tnh l c th trn cc hu t cn li vo thnh ton b mng
hu t. T bi ton sp xp

hu t quy v bi ton sp xp ti a hu
( )

t. Thi gian thc hin gii thut l

Khun kh ca chuyn khng cho php chng ti trnh by ton b chng


minh v m ngun ca hai thut ton ny. Bn c c th tham kho bi bo
gc v chi tit ca chng. Chng ta tha nhn c thut ton xy dng mng
hu t trong thi gian
4.3.2. Xy dng mng tin t chung di nht.
trong duy nht
cng vi
. Cn phi xy dng mng
:

Bi ton: Cho xu
mng hu t tng ng
tin t chung di nht

,
,

di tin t chung di nht gia hu t

4.3.2.1. Thut ton


Thut ton ph bin nht xy dng mng
Sau y ta trnh by thut ton .

v hu t

c xut bi Kasai [8].

V thut ton dng cy hu t trc tip l thut ton tuyn tnh nhng kh phc tp, ngi ta tm c thut ton

tuyn tnh n gin hn nhng cn dng cy hu t mt cch gin tip qua mng hu t. Tuy vy iu ny s khng cn
ngha l thuyt nu nh thut ton xy dng mng hu t khng phi l thut ton tuyn tnh.

178

Trc ht ta tnh mng


mng hu t. Tc l:

Mng
[
[

s
]
].

trong

c
[

l v tr ca hu t

xy
] v

dng
[

trong

theo
th
t:
] s c tnh da vo

[
], v
[
] l hu t ng lin
Vi mi gi tr , gi
trc hu t trong mng hu t. Theo nh ngha v mng
ta c l
di tin t chung di nht gia
v
. Loi b k t u tin ca c hai
hu t ny, ta c: tin t chung di nht gia hai hu t
v
c
di
nu
v bng 0 trong trng hp ngc li.
V hu t ng lin trc hu t trong mng hu t tc l
. Nu
ta c
nn nu loi b k t u ging nhau t hai hu t ny th
vn nh hn v ng trc
trong mng hu t. Xt trn th t t
in ca mng hu t,
c th khng ng lin trc
nhng bi
tin t chung di nht ca chng c di
, mi hu t nm gia chng
trong mng hu t u phi c
k t u trng vi
cng nh vi
. iu ny ch ra rng
c t nht
k t u trng vi hu t
[
]
ng lin trc n trong mng hu t hay
. D nhin bt
ng thc ny ng c vi trng hp
. T ta c b sau:
B 3
Vi

, ta c

B 3 cho php ta ci t thut ton tnh mng tin t chung di nht bng
mt thut ton rt ngn gn:

179

lcp[1] := 0;
q := 0;
for i := 1 to n - 1 do
begin //lcp[i] q
j := sa[rank[i] - 1]; //j l hu t ng lin trc i trong mng hu t
while t[i + q] = t[j + q] do q := q + 1; //Tng q nu k t th q+1 ca hu t i v hu t j khp nhau
lcp[rank[i]] := q; //Do k t th q + 1 ca hu t i v hu t j khc nhau
q := q - 1; //Gim q chun b cho bc sau
if q < 0 then q := 0;
end;

c duy nht mt k t cm canh cui nh hn mi k t khc, hu t th


ca
chc chn ng u th t t in trong cc hu t v nh vy
[
]
[ ]
[
] na. Mi bc lp
v ta khng cn tnh
[
] vi mt iu kin
vi hu t
th
, thut ton s tnh
[
]
chc chn l
. Gi l hu t ng lin trc hu t trong th
t t in ca mng hu t, khi hai hu t ny c t nht k t u tin
trng nhau. Tng ln n khi k t th
ca hai hu t v khng khp
(chc chn tm c k t th
khng khp v trong xu ban u c k t
[
]
cm canh@), ta c
Vic cui cng l gim i 1 n v
[
]).
chun b cho bc sau (tnh
V

Thi gian thc hin gii thut c th nh gi qua s ln gi tr tng hoc


gim bi hai lnh
v
. Gi tr ca c khi to bng 0.
Vng lp while chc chn tm c gi tr m k t th
ca hai hu t
]
[
]), do nhng lnh
v khng khp nhau ( [
khng th lm cho vt qu . Ngoi ra c ti a
ln b gim sau mi
bc lp, suy ra s lnh tng (
) c s ln thc hin khng vt qu
. S lnh gim (
) c s ln thc hin ng bng
. Vy
thut ton Kasai c th dng c mng
trong thi gian
.
4.3.2.2. Ci t
Input:
Dng 1: Xu gm khng qu
hin 1 ln cui xu.
Dng 2: Cc gi tr

k t
ng vi mng hu t

Output
Mng tin t chung di nht

180

, k t @ ch xut

Sample Input

Sample Output

BANANA@
7 6 4 2 1 5 3

0 0 1 3 0 0 2

LCPARRAY.PAS Tnh mng tin t chung di nht

{$MODE OBJFPC}
program LCPArrayConstruction;
const
maxN = 100000;
var
T: AnsiString;
sa, rank, lcp: array[1..maxN] of Integer;
n: Integer;
procedure Enter; //Nhp d liu
var
i: Integer;
begin
ReadLn(T);
n := Length(T);
for i := 1 to n do Read(sa[i]);
end;
procedure LCPArray; //Tnh mng tin t chung di nht
var
i, j, q: Integer;
begin
for i := 1 to n do rank[sa[i]] := i;//Tnh hng ca mi hu t
lcp[1] := 0;
q := 0;
for i := 1 to n - 1 do
begin
j := sa[rank[i] - 1]; //j l hu t ng lin trc i trong th t t in ca mng hu t
while t[i + q] = t[j + q] do Inc(q); //Tng q nu k t th q+1 ca hu t i v hu t j
khp nhau

lcp[rank[i]] := q; //Do k t th q + 1 ca hu t i v hu t j khc nhau


Dec(q); //Gim q chun b cho bc sau: tnh lcp[rank[i +1]]
if q < 0 then q := 0;
end;
end;
procedure PrintResult;
var
i: Integer;
begin
for i := 1 to n do Write(lcp[i], ' ');
WriteLn;

181

end;
begin
Enter;
LCPArray;
PrintResult;
end.

4.3.3. Xy dng cy hu t
Bi ton: Cho xu
hu t

trong c duy nht


. Cho mng
ca
v mng tin t chung di nht
. Cn xy dng cy hu t ca :
.

4.3.3.1. Thut ton


tng ca thut ton l chn ln lt cc hu t trong mng hu t vo cy.
Bt u t mt cy ch gm nt gc, thut ton ln lt xt cc hu t theo th
t t in:
. Mi khi thut ton xt ti hu t
c
th c mt nt nhnh v mt nt l c b sung to ra nt l mang nhn
.
C th hn, ta bt u t mt cy ch gm nt gc v nt l cc phi c t
bng gc. V tr nt s c cp nht bng l mi c chn vo cy ti mi
bc. Xt ln lt cc hu t trong mng hu t. Mi khi xt ti hu t
ta
i t l cc phi ln pha gc cho ti khi gp mt nt c su
. Gi l nt con ca i qua trong qu trnh di chuyn t ln .
Trng hp 1: Nu
, ta ch cn to mt nt l mi lm con
] Hnh 10 a) l v d v cy
ca v t nhn cnh
bng [
va c chn ABCDE@ v sau chn thm ABCFG@, trong v d ny ta
tm c nt
c
l tin t chung di nht ca ABCDE@ v
ABCGH@
Trng hp 2: Nu

Thm nt lm con v cha tch cnh


lm hai cnh
v
. Nhn cnh
cng c tch ra hai phn:
k
t u c ly lm nhn cnh
, cc k t sau c ly lm nhn
cnh
]
Thm nt l lm con vi nhn cnh
bng [
182

Hnh 10 b) l cng l v d v cy va c chn ABCDE@ v sau chn


thm ABCFG@, qu trnh i ngc t l ln dng nt nhng
cha
phi l tin t chung di nht ca ABCDE@ v ABCFG@ (bng ABC). Ta cn
chia cnh
ra lm hai phn bi nt mi sao cho
sau b
sung nt l
lm con
vi nhn cnh
l FG@ c c
.

BC

BC

BC
BCDE

DE FG@

DE

DE FG@

b)

a)

Hnh 10. Chn ABCGH@ vo cy hu t

Khng kh khn chng minh gii thut dng cy hu t t mng hu t v


mng tin t chung di nht nh trn c th thc hin trong thi gian
v
n thun l php duyt cc cnh trn cy:
Mi cnh c duyt qua ti a mt ln trong php di chuyn t l ln gc
(cnh i qua cui cng c th b xa v thay bng 2 cnh mi)
Mi php chn hu t vo cy lm tng s cnh ln nhiu nht l 2.
4.3.3.2. Ci t
Input:
Dng 1: Xu gm khng qu
hin 1 ln cui xu.
Dng 2: Cc gi tr
Dng 3: Cc gi tr

k t

, k t @ ch xut

ng vi mng hu t
ng vi mng tin t chung di nht

Output
183

Cy hu t
Sample Input
BANANA@
7 6 4 2 1 5 3
0 0 1 3 0 0 2

Sample Output
--ROOT
{
--@
--A
{
--@
--NA
{
--@
--NA@
}
}
--BANANA@
--NA
{
--@
--NA@
}
}

Trong chng trnh ci t di y, ta t chc cc nt ca cy hu t trong mt


mng
. Mi nt l mt bn ghi gm cc trng:

]
: Nhn ca cnh ni t nt cha l xu [
: su ca nt
: Ch s nt cha
[ ] l ch s nt con ng vi cc nhn cnh c k t
[
]:
u l .
SUFFIXTREECONSTRUCTION.PAS Dng cy hu t

{$MODE OBJFPC}
program SuffixTreeConstruction;
const
maxN = 100000;
type
TAlphabet = '@'..'Z';
TNode = record //Cu trc nt
indexL, indexH: Integer; //Xc nh nhn cnh ni t nt cha
depth: Integer; // su
parent: Integer; //Ch s nt cha
child: array[TAlphabet] of Integer; //Ch s cc nt con
end;
var
T: AnsiString;

184

sa, lcp: array[1..maxN] of Integer;


nodes: array[1..2 * maxN] of TNode;
n: Integer;
x, nodeptr: Integer;
procedure Enter; //Nhp d liu
var
i: Integer;
begin
ReadLn(T);
n := Length(T);
for i := 1 to n do Read(sa[i]);
ReadLn;
for i := 1 to n do Read(lcp[i]);
end;
function NewNode: Integer; //To mt nt mi mang ch s nodeptr
begin
Inc(nodeptr);
FillChar(nodes[nodeptr], SizeOf(nodes[nodeptr]), 0);
Result := nodeptr;
end;
procedure Init; //Khi to cy ch gm nt 1
begin
nodeptr := 0;
x := NewNode;
end;
procedure SetLink(u, v: Integer); //Cho nt u lm cha nt v
var
ch: TAlphabet;
begin
ch := T[nodes[v].indexL]; //c k t u nhn cnh
nodes[v].parent := u;
nodes[u].child[ch] := v;
end;
//Th tc chnh: Chn hu t t[suffindexn] vo cy, bit di tin t chung di nht ca hu t ny vi hu t va
chn l lcpvalue

procedure InsertSuffix(suffindex, lcpvalue: Integer);


var
u, v, w, y: Integer;
k, p: Integer;
begin
u := x;
while nodes[u].depth > lcpvalue do //i t l cc phi x ln gc tm nt u c su lcpvalue
begin
v := u;

185

u := nodes[v].parent;
end;
if nodes[u].depth = lcpvalue then //Nu u c su ng bng lcpvalue
begin
y := NewNode; //To nt l y mi lm con ca u
with nodes[y] do
begin
indexL := suffindex + lcpvalue;
indexH := n;
depth := n - suffindex + 1; // su ca y bng chiu di hu t
end;
SetLink(u, y);
end
else //u c su < lcpvalue
begin
//To nt w c su lcpvalue chn vo gia cnh (u, v), nhn (u, w) ni vi nhn (w, v) = nhn (u, v) c

w := NewNode;
k := nodes[v].indexL;
p := lcpvalue - nodes[u].depth;
nodes[w].indexL := k;
nodes[w].indexH := k + p - 1;
nodes[w].depth := lcpvalue;
nodes[v].indexL := k + p;
SetLink(u, w);
setLink(w, v);
y := NewNode; //To nt l y lm con ca w
with nodes[y] do
begin
indexL := suffindex + lcpvalue;
indexH := n;
depth := n - suffindex + 1; // su ca y = chiu di hu t
end;
SetLink(w, y);
end;
x := y; //Cp nht l cc phi mi
end;
procedure SuffixTree;
var
i: Integer;
begin
for i := 1 to n do
InsertSuffix(sa[i], lcp[i]); //Chn ln lt cc hu t theo th t t in vo cy
end;
//Cc th tc trnh by output (khng quan trng)

procedure WriteBlank(nb: Integer);


var
i: Integer;

186

begin
for i := 1 to nb do Write(' ');
end;
procedure Visit(i: Integer; indent: Integer);
var
ch: TAlphabet;
j: Integer;
begin
if i = 0 then Exit;
WriteBlank(indent);
Write('--');
if i = 1 then Write('ROOT')
else
with nodes[i] do
for j := indexL to indexH do Write(t[j]);
WriteLn;
if nodes[i].indexH <> n then
begin
WriteBlank(indent + 2); WriteLn('{');
for ch := Low(TAlphabet) to High(TAlphabet) do
Visit(nodes[i].child[ch], indent + 4);
WriteBlank(indent + 2); WriteLn('}');
end;
end;
procedure PrintResult;
begin
Visit(1, 0);
end;
begin
Enter;
Init;
SuffixTree;
PrintResult;
end.

4.4. Bi tp v d
4.4.1. Mt m n (ACM 2003)
Cho xu di
, tm hon v vng quanh c th t t in nh nht. V
d vi xu ALABALA th hon v vng quanh nh nht l AALABAL
Thut ton:

187

Mc d c thut ton
ci t n gin hn, vic p dng cc thut ton
dng mng hu t cng l mt gii php khng mt nhiu cng sc suy ngh.
Ch l vic khng c s dng k t cm canh c th dn ti vi sa i nh
trong ci t thut ton
4.4.2. S xu con phn bit (IOI training camp 2003)
Bn c cho xu di khng qu
nhau v khc rng ca .

, cho bit c bao nhiu xu con khc

Thut ton
Bi ton n thun l m s nt trn trie hu t ngoi tr nt gc, tng ng
vi vic m s cnh trn trie. Vn tn km b nh v thi gian khi xy
dng trie c th c khc phc bng cy hu t vi mt s sa i nh. Tuy
nhin cch hay nht l dng mng tin t chung di nht.
Gi s ta c mng hu t
v mng tin t chung di nht
. Phn tch qu trnh hu t
c chn vo trie,
k t u c duyt qua m khng c s b sung nt v cnh. Nhng k t
sau, mi k t s b sung 1 cnh v 1 nt trn trie. Suy ra p s l:

(Do

4.4.3. Xu con (Training Camp 2003)


Cho xu gm k t (
hin trong xu t nht ln.

) v mt s

, tm xu con di nht xut

Thut ton:
Ta trnh by phng php dng trie hu t, trn cy hu t cng c th dng
phng php tng t. Tuy nhin bi ton ny c th gii mt cch n gin
bng mng hu t v mng tin t chung gn nht. Gi : iu kin c mt
xu di xut hin ln trong xu l trong mng
tn ti
s
lin tip
4.4.4. Xu con i xng di nht (USACO training gate)
Cho xu

di

, tm xu con i xng di nht.


188

Thut ton:
Gi l xu o ngc ca xu , nhn xt rng mt xu i xng di l ca
c k t ng gia l s phi c dng
trong l mt xu con ca
bt u t v tr
v cng l xu con ca
bt u ti v tr
. Dng
v mng hu t
xu
, khi :
Mi xu con ca bt u t v tr phi l tin t ca hu t th ca
Mi xu con ca bt u t v tr
phi l tin t ca hu t th
ca
Vn quy v tm tin t chung di nht gia hai hu t ca . Trn mng hu
t
v mng
. Tin
t chung di nht gia hu t
v hu t
(
) l gi tr nh nht trong
[
], truy vn gi tr nh nht trong mt khong lin tip
cc gi tr
(range-minimum query) c th c thc hin trong thi gian
bng
cu trc d liu segment trees hoc skip lists hoc thc hin trong thi gian
bng php quy dn LCA hay Bucket Pointers. Khi xt trn mi v tr ,
thut ton tm xu con i xng di nht di l mt thi gian
hoc
ty theo cu trc d liu c la chn.
Vn tng t trong vic tm xu con i xng di nht di chn.
4.4.5. Mu ghp (Polish Olympiad in Informatics 2004)
Cho xu di
, tm xu ngn nht sao cho mi k t trong u
tn ti mt xu con no ca ng bng cha v tr k t . Hay ni
cch khc, l mt php ghp gi ca mt lot cc xu
ababbababbababbabaababbaba (A)
ababbaba (B)
ababbaba
ababbaba
ababbaba
Thut ton
Cch gii l s dng mng hu t
kt hp vi mt
cu trc d liu truy vn phm vi. Bt u vi
. Nhng hu t c k t
u bng
s nm trong mt khong lin tip trong mng hu t (t v tr ti
v tr ). V tr ban u ca cc hu t ny trong xu s c nh du bi s 1,
nhng v tr khc c nh du bi s 0.
189

Ln lt thm cc k t
vo . Mi khi di thm mt k t, s c
thm nhng hu t ca khng cn nhn lm tin t na, ta co ngn phm vi
] li v nh du v tr trong xu ca cc hu t nm ngoi phm
hot ng [
vi hot ng bi s 0. Thut ton s dng ngay khi ti mt bc m di xu
dy nhiu s 0 lin tip nht. Vic o di dy gm nhiu s 0 lin tip
nht c th thc hin trong thi gian
bng mt cu trc d liu truy
vn phm vi nh segment trees. Ton b thut ton c phc tp
.
4.4.6. Lin kt hu t (suffix links)
Thc ra trong cu trc ca cy hu t, cn c mt thnh phn na gi l cc lin
kt hu t (suffix links). Mi nt nhnh ca cy hu t cha mt con tr ti
mt nt khc sao cho nu
th
( y l mt k t cn l
mt xu)
Tt c cc thut ton tuyn tnh dng cy hu t trc tip theo ti bit u phi
s dng lin kt hu t. Tuy nhin nu ta dng cy hu t t mng hu t v
mng tin t chung di nht, cc lin kt hu t b b qua.
Cc lin kt hu t i khi rt quan trng trong mt s thut ton x l xu. V
vy ta t vn : cho cy hu t
ca mt xu di , cn phi xy
dng ton b cc lin kt hu t.
Gii php:
Gn cho mi nt nhnh ca cy hu t mt cp
tha mn:
l hai hu
t ng vi hai l nm hai nhnh con khc nhau ca . Vic gn cp
cho
tt c cc nt nhnh c th thc hin trong thi gian
bng thut ton duyt
cy t di ln: gn cp hu t cho nt , ta gn cp hu t cho tt c cc
con ca trc bng quy. Sau chn
l hai con bt k ca , gi s
cp hu t gn cho
l
v cp hu t gn cho
l
, khi ta c
th ly cp
lm cp l ng vi .
Vi cp hu t
ca nt , chng ng vi hai l nm hai nhnh con khc
nhau m l tin bi chung thp nht ca ca hai l , vy nn tin t chung
di nht ca hai hu t
v
chnh l m ta k hiu l . Cng t ,
tin t chung di nht ca hai hu t
v
phi l . Xc nh hai l
cha hu t
v
v l tin bi chung thp nht ca hai l ny. Ta c

tc l con tr lin kt t phi tr ti .

190

C rt nhiu thut ton tm tin bi chung thp nht ca hai nt trong thi gian
, chng hn cc thut ton xut bi Tarjan [6] hay Fisher [2]. V cy hu
t c
nt, vic thit lp ton b cc lin kt hu t c th thc hin trong
thi gian
. Bn c c th tham kho thm trong cc ti liu v hai bi ton
LCA v RMQ v mi lin h gia chng.
4.4.7. Xu con chung di nht
Bi ton tm xu con chung di nht (longest common substring) l mt bi ton
quan trng trong x l xu. Tn ca bi ton nu ln ni dung ca n: Cho
hai xu
, cn tm xu di ln nht va l xu con ca , va l xu con
ca .
Thut ton
Gi s

Dng cy hu t ca . Bt u t gc, ta duyt cc k t trong v r xung


nhnh con tng ng trn cy hu t. Nu ti mt nt no khng c nhnh
con tng ng r xung, ta ghi nhn li nt cng vi su ca n ( l
xu con di nht ca khp vi on u xu ), tip theo ta nhy theo lin kt
hu t t sang nt ( khp vi xu ti v tr th 2) v i tip theo cch
nh vy.
Sau khi duyt ht xu , nt c su ln nht ghi nhn c s c nhn l xu
con chung di nht cn tm.
phc tp tnh ton:

4.5. Kt lun
Cy hu t, mng hu t v mng tin t chung di nht l nhng cu trc d
liu c mi lin h cht ch. Ngoi vic cung cp nhiu php ton quan trng
trong x l xu, nhng k thut hay c p dng trong qu trnh xy dng cu
trc d liu cng rt ng ch .
Mt trong nhng hng nghin cu c quan tm l s dng cy hu t x
l d liu thuc mt bng ch ci ln. Cu trc nt ca cy c th tr nn rt
cng knh nu bng ch ci ln. Nh v d trong chuyn ny, mi nt phi
cha mt mng cc con tr lin kt ti cc nt con. Kch thc ca mng con
tr ny ng bng | |.
191

Khi kch thc bng ch ci ln, mng con tr c th c thay th bng danh
sch mc ni hay cy nh phn tm kim t cn bng tit kim b nh hn,
tuy nhin iu c th lm phc tp tnh ton ca thut ton b ph thuc
vo | |. Bng di y tm tt v nh hng ca cu trc nt ln thao tc r
nhnh (t mt nt i sang nt con theo cnh mang nhn c k t u
)
Cu trc
Mng con tr
Cy nh phn tm kim t cn bng
Danh sch mc ni

R nhnh

B nh
| |

| |
| |

Khc vi cy hu t, mng hu t cng nh cc thut ton xy dng mng hu


t li khng gp kh khn g khi bng ch ci ln. Tuy vy, c rt nhiu thao
tc quan trng trn cy hu t khng th dng mng hu t thay th c.
Nm 2004, nhm nghin cu ca Abouelhoda sau khi phn tch cc ng dng
c ca cy hu t ch ra rng: mi thao tc x l trn cy hu t trong cc
ng dng bit c th quy v ba thao tc c bn [1]:
Duyt cy t di ln, tng hp thng tin t cc nt con ln nt cha
(bottom-up)
Duyt cy t trn xung, i t nt cha xung nt con theo mt nhn cho
trc (top-down)
T mt nt i sang mt nt khc theo lin kt hu t.
T , cc tc gi xut thm nhng thut ton xy dng cu trc d liu
b sung. Nhng cu trc d liu ny s kt hp vi mng hu t m phng
ba thao tc c bn trn. Cu trc d liu mi ny c tn l mng hu t tng
cng (enhanced suffix arrays), c chng minh rng c th thay th cho cy
hu t trong tt c cc ng dng bit3. Kt qu ny ko theo nhiu nghin
cu nhm nng cao tnh hiu qu ca thut ton xy dng mng hu t. Cho ti
nm 2007, trong bi tng quan ca Puglisi trn tp ch ACM Computing Survey
[15], c ti 20 thut ton xy dng mng hu t c nh gi, chng da
trn nhng cch tip cn khc nhau, c nhng u/nhc im khc nhau ty
thuc vo dng d liu.

Nguyn vn every algorithm that uses a suffix tree as data structure can systematically be replaced with an algorithm

that uses an enhanced suffix array and solves the same problem in the same time complexity.

192

Tuy nhin, vic s dng mng hu t m phng cy hu t i khi lm mt


i tnh trc quan v gy kh khn trong thit k thut ton. Nm 2008, nhm
nghin cu ca Kim sa i cu trc ca cy hu t thnh mt cu trc d
liu mi gi l cy lcp-interval (lcp-interval trees) [9] vi y cc tnh nng
ca cy hu t cng nh mng hu t. Tuy tc th nghim trn d liu thc
c thua km mng hu t tng cng mt cht, nhng cu trc d liu ny kh
d ci t, tit kim b nh v quan trng nht l vn gi nguyn c cu trc
cy.
Trong cc k thi lp trnh c s hn ch thi gian, ngoi tiu ch v tnh hiu
qu trong vic la chn thut ton, lun phi quan tm ti tnh n gin. Nhng
cu trc d liu trong chuyn ny khng d ci t, chnh v vy th sinh
khng nn lm dng chng trong phng thi. V d: thay v mt ~100 dng lnh
ci t mng hu t (hoc hn vi cy hu t) ch gii quyt bi ton xc
nh xu con, th sinh c th ci t thut ton KMP vi cha ti 20 dng lnh
nhng li t hiu qu cao hn rt nhiu.
Nu th sinh bit v cy/mng hu t v gp mt bi ton c th gii quyt
trit bng cc cu trc d liu ny, th sinh t nhiu s c li th v tm l bi
vic cn li ch l vn thi gian. Tuy nhin li th ny s nhanh chng to ra
bt li nu:
Rng buc d liu v yu cu ca bi ton cho php thit k thut ton n
gin v hiu qu hn nhiu. Nu khng phn tch k bi, th sinh s mt
c hi tm ra thut ton tt v b thit v thi gian. Tm li, nu c u
hoc khng phn tch k bi th cng bit nhiu s cng bt li.
Kh nng ci t ca th sinh khng tt, quy trnh kim th ca th sinh
khng cn thn, hoc th sinh khng thi gian kim th. Cu trc d
liu hiu qu nhng ci t sai c th mt nhiu im hn c nhng chng
trnh ci t thut ton tm thng.
s dng cc thut ton hay cu trc d liu phc tp mt cch hiu qu (ni
ring vi cy/mng hu t), th sinh phi phn tch k rng buc v yu cu bi
ton v c gng tm thut ton n gin. Trong trng hp bt buc phi s
dng gii php phc tp, cn lng trc thi gian lp trnh, g ri v kim th.
Ngoi ra, vic t thut ton tm thng cng l cn thit i snh kt qu v
trnh mt im qu nhiu nu khng kp thi gian hon thin.

193

Ti liu tham kho


1 Abouelhoda, Mohamed Ibrahim, Kurtz, Stefan, and Ohlebusch, Enno. Replacing suffix
trees with enhanced suffix arrays. Journal of Discrete Algorithms, 2, 1 (2004), 53-86.
2 Fische, Johannes and Heun, Volker. Theoretical and Practical Improvements on the RMQProblem, with Applications to LCA and LCE. Lecture notes in Computer Science, 4009
(2006), 36-48.
3 Fredkin, Edward. Trie memory. Communications of the ACM, 3, 9 (1960), 490-499.
4 Giegerich, Robert, Kurtz, Stefan, and Stoye, Jens. Efficient implementation of lazy suffix
trees. In Proceedings of the 3rd International Workshop on Algorithm Engineering
(London, UK 1999), 30-42.
5 Gusfield, Dan. Algorithms on strings, trees, and sequences: computer science and
computational biology. Cambridge University Press, New York, USA, 1997.
6 Harel, Dov and Tarjan, Robert Endre. Fast Algorithms for Finding Nearest Common
Ancestors. SIAM Journal on Computing, 13, 2 (1984), 338-355.
7 Krkkinen, Juha and Sanders, Peter. Simple linear work suffix array construction. In
Proceedings of the 13th international conference on automata, languages and
programming ( 2003), 943-955.
8 Kasai, Toru, Lee, Gunho, Arimura, Hiroki, Arikawa, Setsuo, and Park, Kunsoo. Linear-time
longest-common-prefix computation in suffix arrays and its applications. In Proceedings
of the 12th Annual Symposium on Combinatorial Pattern Matching (London 2001), 181192.
9 Kim, Dong Kyue, Kim, Minhwan, and Park, Heejin. Linearized Suffix Tree: an efficient
index data structure with the capabilities of suffix trees and suffix arrays. Algorithmica,
52, 3 (2008), 350-377.
10 Ko, Pang and Aluru, Srinivas. Space efficient linear time construction of suffix arrays.
Proceedings of the 14th annual symposium on combinatorial pattern matching (2003),
200-210.
11 Kosaraju, Sambasiva Rao. Real-time pattern matching and quasi-real-time construction of
suffix trees. In Proceedings of the 26th annual ACM symposium on theory of computing (
1994), ACM, 310-316.
12 Manber, Udi and Myers, Gene. Suffix arrays: a new method for on-line string searches. In
Proceedings of the first annual ACM-SIAM symposium on discrete algorithms (San
Francisco 1990), Society for Industrial and Applied Mathematics, 319-327.

194

13 McCreight, Edward Meyers. A space-economical suffix tree construction algorithm.


Journal of the ACM, 23, 2 (Apr. 1976), 262-272.
14 Morrison, Donald R.. PATRICIA - Practical algorithm to retrieve information coded in
alphanumeric. Journal of the ACM, 15, 4 (1968), 514-534.
15 Puglisi, Simon J., Smyth, William F., and Turpin, Andrew H. A taxonomy of suffix array
construction algorithms. ACM Computing Survey, 39, 2 (2007), 1-31.
16 Slissenko, Anatol. Detection of periodicities and string-matching in real time. Journal of
Soviet Mathematics, 22, 3 (1983), 1316-1386.
17 Ukkonen Esko. On-line construction of suffix trees. Algorithmica, 14, 3 (1995), 249-260.
18 Weiner, Peter. Linear pattern matching algorithms. In Proceedings of the 14th Annual
Symposium on Switching and Automata Theory (Washington, DC, USA 1973), IEEE
Computer Society, 1-11.

195

You might also like