Professional Documents
Culture Documents
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.
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.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}
4
1
5
1
Hnh 4
B
A
4
1
5
5
1
4
1
3
1
1
4
1
5
1
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
CSDL
Truy vn
Np d liu
Kt
qu
10
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
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 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
BR_LIST.OUT
((()))
(())()
17
LINE_UP.OUT
78
c.push()
c.back()
c.front()
c.pop_front()
c.push_back()
Cu trc c
Hnh 12
19
c.pop()
20
Hnh 13
22
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
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
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
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.
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;
}
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
i=1 n
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
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
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
f(i) f i ( a j ) mod m.
j 1
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
44
Thng tin m ha
Cnh o Ngang
POETRY.OUT
2
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
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
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
48
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
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
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
DONUT.OUT
ABRACADABRA
MADAMIMADAM
ABAC
0
ABCDEFGHIJKLMNOPQRSTUVWXYZHHHHHABCDEFGHIJKLMNOPQRSTUVWX
YZ
53
V d:
ARSUM.INP
1
1070
ARSUM.OUT
4
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
56
2y 2
y 2k
x
x y (mod N )
(mod (N) (*)
2y 2
y 2k 1
x x
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
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
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:
Do (n) n 1
1
1
1
. 1 ... 1
p1
p2
pk
(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
x a2
(I)
...
x a
n
mod m1
mod m2
mod mn
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
x 3
x 2
mod 3
mod 5 vi x [300; 400]
mod 7
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
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
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
q( x) q0 q1 x ... qn1 x n1 . Thc hin nhn hai a thc ny bng thut ton chia
n
1
2
v ph ( x) pn pn x ... pn1 x
2
n
1
2
n
2
n
1
2
v qh ( x) qn qn x ... qn1 x 2
2
n
2
p( x).q( x) rl ( x) rm ( x) rl ( x) rh ( x) .x 2 rh ( x).x n .
1 3 4
1 1 2
1 2 5
0 x 2 y 2 z 6
0 x 0 y 4 z 8
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
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
b
l mt nghim. Cc nghim khc chnh
d
n
d
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
mod mn
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
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
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
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
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
= 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
106
Lucky.out
49 1
7 5
3 2
3 0
108
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
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
DIGITS.OUT
1
4
4
111
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
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
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;
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
[ ]
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:
Dng u cha 3 s nguyn dng n, k, D (n 3, k 109, D
30);
STOCK.OUT
255
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
VACCINE.OUT
2
137
=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
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
NUMTAB.OUT
3
4
4
3
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];
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
TILES.INP
3
1
1
0
0
0
TILES.OUT
5
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
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
CSTR.OUT
AABB
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:
150
STOCK2.OUT
3
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
m t li.
Output
PALPATH.INP
2 7
ioivnoi
vnoiioi
PALPATH.OUT
7
1 1
1 2
1 3
2 4
2 5
2 6
2 7
[a..z]
= 6,
Gi tr
400
400
3 v 5
100
1000
150
750
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
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]
158
Dng u tin cha bn s nguyn n, A, B v D (1 n 1000, 0
A D B 10000);
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
c tnh bc cu, tc l:
v
v
th
th
.
.
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
Hu t
: Tin t ca mt hu t
Trie l thut ng ly t retrieval, c pht m l /tri/ ging nh tree hoc /tra/ ging nh try
162
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
163
AB
@
C
ABC
AB@
@
a)
b)
ABC@
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@
@
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
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
NA
BANANA@
NA
NA@
NA@
Hnh 6. Cy hu t
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
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:
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
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
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
Bi ton: Cho xu
dng mng hu t
. Cn xy
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@
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
{$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
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
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.
177
( )
hu t quy v bi ton sp xp ti a hu
( )
Bi ton: Cho xu
mng hu t tng ng
tin t chung di nht
,
,
v hu t
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
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;
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
{$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
181
end;
begin
Enter;
LCPArray;
PrintResult;
end.
4.3.3. Xy dng cy hu t
Bi ton: Cho xu
hu t
BC
BC
BC
BCDE
DE FG@
DE
DE FG@
b)
a)
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@
}
}
]
: 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
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)
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 .
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
) v mt s
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
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
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
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
| |
| |
| |
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
193
194
195