Professional Documents
Culture Documents
1
.
k Gray(k) GLine(4,k) k Gray(k) GLine(4,k)
0: 0000
1: 0001
2: 0010
3: 0011
4: 0100
5: 0101
6: 0110
7: 0111
0: 0000
1: 0001
3: 0011
2: 0010
6: 0110
7: 0111
5: 0101
4: 0100
QQQQ
QQQM
QQMM
QQMQ
QMMQ
QMMM
QMQM
QMQQ
8: 1000
9: 1001
10: 1010
11: 1011
12: 1100
13: 1101
14: 1110
15: 1111
12: 1100
13: 1101
15: 1111
14: 1110
10: 1010
11: 1011
9: 1001
8: 1000
MMQQ
MMQM
MMMM
MMMQ
MQMQ
MQMM
MQQM
MQQQ
M Gray v gi tr ca hm Gline ca 16
79
s t nhin u tin k = 0..15.
Nh m Gray ta c th vit hm GLine(n,k) cho ra dng
k trong thip T(n) mt cch n gin nh sau:
Bc 1. Tnh x = Gray(k) = (k shr 1) xor k = (k div 2)
xor k.
Bc 2. Xt n bit thp ca x, nu l 1 th vit M nu l
0 th vit Q.
(* Pascal *)
function Gray(k: longint): longint;
begin Gray := (k shr 1) xor k end;
function Gline(n: integer; k: longint): string;
var s: string; i: integer;
const cc: array[0..1] of char = ('Q','M');
begin
k := Gray(k); s = ;
for i := n-1 downto 0 do
s = s + cc[(k shr i) and 1];
GLine := s;
end;
// C#
static public int Gray(int k){ return (k >> 1) ^ k; }
static public string GLine(int n, int k) {
string cc = "QM";
string s = "";
k = Gray(k);
for (int i = n-1; i >= 0; --i)
s += cc[(k >> i) & 1];
return s;
}
Bi 2.10 Tng on
Mt dy con gm cc phn t lin tip nhau trong mt dy cho trc c gi l on. Cho dy
gm N s t nhin. Tm on ngn nht c tng cc phn t bng gi tr K cho trc.
D liu vo: tp vn bn TDOAN.INP
Dng th nht: hai s t nhin N v K,
1 s N s 2000.
T dng th hai tr i: cc phn t ca dy.
D liu ra: tp vn bn TDOAN.OUT
Cha mt dng duy nht gm hai s t nhin d
ch s u on v L s phn t trong on (chiu
di on). Nu v nghim th ghi 0 0.
Trong cc tp, d liu trn cng dng cch
nhau qua du cch.
Thut ton
Frank Gray l nh vt l hc M lm nghin
cu vin ti hng Bell Labs vi hng lot pht
minh c gi tr c ng dng trong truyn
hnh, c hc, in t v ton hc. Nm 1947
Gray ng k bng pht minh v m nh phn
phn hi sau ny c gi l m Gray.
TDOAN.INP TDOAN.OUT
21 17
0 2 3 2 10
1 5 5 6 12
20 30 14 8 0
11 0 6 0 0
5
16 3
80
Ta gii bng k thut ca s trt nh sau. Xt on a[i..j] vi tng S = a[i] + a[i+1] + + a[j], i s
j. on ny c gi l ca s. Ta cho ca s ny trt dn qua phi v xt ba tnh hung sau y.
1) (S = K): ta ghi nhn im u i v di on l ji+1. Nu di ny nh hn di LMin th
ta cp nht li cc gi tr iMin v Lmin (th tc Update). Ri tip tc xt ca s mi l a[i+1..j] .
2) (S < K): Ta dch u phi ca ca s t j sang j+1, gi nguyn u tri (th tc Right).
3) (S > K): Ta co u tri ca ca s t i thnh i+1 (th tc Left).
Ta t phn t a[n+1] = 0 lm lnh canh.
(****************************************
TONG DOAN - Doan ngan nhat
co tong K
****************************************)
program TDoan;
uses crt;
const
mn = 2001; bl = #32;
fn = 'TDOAN.INP'; gn = 'TDOAN.OUT';
type mw1 = array[0..mn] of word;
var f,g: text;
n,k: word;
a: mw1;
iMin, LMin: word;
iLeft,iRight: word;
sum: word;
procedure Doc;
var i: word;
begin
assign(f,fn); reset(f); readln(f,n, k);
for i := 1 to n do read(f,a[i]);
close(f);
end;
procedure Left;
begin
sum := sum - a[iLeft]; iLeft := iLeft + 1;
if (iLeft > iRight) then
begin iRight := iLeft; sum := a[iLeft]; end;
end;
procedure Right;
begin iRight := iRight + 1; sum := sum + a[iRight]; end;
procedure Update;
begin
if (LMin > iRight - iLeft + 1) then
begin iMin := iLeft; LMin := iRight - iLeft + 1; end;
Left;
end;
procedure XuLi;
begin
iLeft := 1; iRight := iLeft;
LMin := n + 1; sum := a[1];
repeat
if (sum = k) then Update
else if (sum < k) then Right
else { sum > k } Left;
until (iRight > n);
if (LMin = n+1) then LMin := 0;
end;
81
procedure Ghi;
begin
assign(g,gn); rewrite(g); writeln(g,iMin,bl,LMin); close(g);
end;
BEGIN
Doc; XuLi; ghi;
END.
// C#
using System;
using System.IO;
using System.Collections;
namespace SangTao2 {
class TongDoan {
const string fn = "TDoan.inp";
const string gn = "TDoan.out";
static public int n; // n - so phan tu
static public int k; // Tong can chon
static public int sum; // tong hien co
static public int ileft, iright; // hai dau cua so
static public int imin, lmin;
static public int [] a;
static void Main(string[] args) {
Doc(); XuLi(); Ghi(); XemKetQua();
Console.WriteLine("\n Fini ");
Console.ReadLine();
}
static public void XemKetQua() {
Console.WriteLine("\n Input: "+fn);
Console.WriteLine(File.ReadAllText(fn));
Console.WriteLine("\n Output: "+gn);
Console.WriteLine(File.ReadAllText(gn));
}
static public void XuLi(){
ileft = 0; iright = ileft;
sum = a[ileft]; lmin = n + 1;
while (iright < n)
if (sum == k) Update();
else if (sum < k) Right();
else /* s > k */ Left();
++imin;
}
static public void Update() {
if (lmin > iright - ileft + 1)
{ imin = ileft; lmin = iright - ileft + 1; }
Left();
}
static public void Left(){
sum -= a[ileft++];
if (ileft > iright)
{ iright = ileft; sum = a[ileft]; }
}
static public void Right() { sum += a[++iright]; }
static public void Doc(){
int[] v =
Array.ConvertAll(((File.ReadAllText(fn))).Split(
82
new char[] { ' ', '\t', '\r', '\n' },
StringSplitOptions.RemoveEmptyEntries),
new Converter<string, int>(int.Parse));
int j = 0; n = v[j++]; k = v[j++];
a = new int[n + 1]; a[n] = 0;
for (int i = 0; i < n; ++i) a[i] = v[j++];
}
static public void Ghi() {
if (lmin == n + 1) File.WriteAllText(gn, "0");
else
File.WriteAllText(gn,imin.ToString()+" "+lmin.ToString());
}
} // TongDoan
} // SangTao2
Bi 2.11 on khng gim di nht
Dijkstra E.
Cho dy gm N s nguyn. Tm on khng gim c chiu di ln nht.
D liu vo: tp vn bn MDOAN.INP
Dng th nht: s t nhin N, 1 s N s 20000.
T dng th hai tr i: cc phn t ca dy.
D liu ra: tp vn bn MDOAN.OUT
Cha mt dng duy nht gm hai s t nhin d ch
s u on v L s phn t trong on (chiu di
on).
Trong cc tp, d liu trn cng dng cch nhau qua
du cch.
Th d trn cho ta on khng gim di nht bao gm 7 phn t bt u t phn t th t trong dy
(cc phn t c gch di):
1 5 5 1 3 3 3 5 7 9 1 2
Thut ton
y l bi d, ta c dn cc phn t t input file v so snh hai phn t lin tip nhau l x (phn t
c trc ti bc i) v y (phn t c sau ti bc i+1). Nu y < x th coi nh kt thc mt an khng
gim, ta cp nht ghi nhn li on khng gim di nht. Cc bin tng th trong chng trnh c
dng nh sau:
MaxLen chiu di ca on khng gim di nht hin tm c,
imax - ch s u tin ca on khng gim di nht hin tm c,
ileft ch s u tin ca on khng gim ang xt.
phc tp: c N.
(* Pascal *)
(****************************************
MDOAN - Doan tang dai nhat
****************************************)
program MDoan;
uses crt;
const
bl = #32; fn = 'MDOAN.INP'; gn = 'MDOAN.OUT';
var f,g: text;
MDOAN.INP MDOAN.OUT
12
1 5 5 1 3
3 3 5 7 9
1 2
4 7
83
n: integer;
a: mw1;
iLeft, imax: integer;
MaxLen: integer;
procedure Update(i: integer);
begin
if (MaxLen < i - iLeft) then
begin
MaxLen := i - iLeft;
imax := iLeft; ileft := i;
end;
iLeft := i;
end;
procedure XuLi;
var i, x, y: integer;
begin
assign(f,fn); reset(f); readln(f,n);
read(f,x);
iLeft := 1; MaxLen := 0;
for i := 2 to n do
begin
read(f,y);
if (y < x) then Update(i);
x := y;
end;
Update(n+1);
close(f);
end;
procedure Ghi;
begin
assign(g,gn); rewrite(g);
writeln(g,imax,bl,MaxLen);
close(g);
end;
BEGIN
XuLi; ghi;
END.
Trong phng n C# di y ta c ton b d liu vo mt mng a ri x l trn mng ny.
// C#
using System;
using System.IO;
using System.Collections;
namespace SangTao2 {
class DoanKhongGiam {
const string fn = "MDoan.inp";
const string gn = "MDoan.out";
static public int n; // n - so phan tu
static public int imax; // chi so dau cua doan max
static public int ileft; // chi so dau cua doan dang xet
static public int maxlen; // chieu dai max
static public int [] a;
static void Main(string[] args) {
Doc(); XuLi(); Ghi(); XemKetQua();
Console.WriteLine("\n Fini ");
Console.ReadLine();
84
}
static public void XemKetQua(): t vit
static public void XuLi() {
ileft = 0; maxlen = 0;
for (int i = 1; i < n; ++i)
if (a[i] < a[i-1]) Update(i);
Update(n);
}
static public void Update(int i) {
if (maxlen < i - ileft)
{ maxlen = i - ileft; imax = ileft; ileft = i; }
}
static public void Doc(): t vit
static public void Ghi() {
File.WriteAllText(gn, imax.ToString() + " " +
maxlen.ToString()); }
} // DoanKhongGiam
} // SangTao2
Bi 2.12 on n iu di nht
Dijkstra E.
Cho dy gm N s nguyn. Tm on n iu (khng gim hoc khng tng) c chiu di ln nht.
D liu vo: tp vn bn DONDIEU.INP
Dng th nht: s t nhin N, 1 s N s 20000.
T dng th hai tr i: cc phn t ca dy.
D liu ra: tp vn bn DONDIEU.OUT
Cha mt dng duy nht gm hai s t nhin d ch
s u on v L s phn t trong on (chiu di
on).
Trong cc tp, d liu trn cng dng cch nhau qua
du cch.
Thut ton
Edsger Wybe Dijkstra (1930-2002)
Sinh nm 1930 ti Rotterdam, Holland.
1948-1956 hc Ton v Vt l l thuyt
ti i hc Leyden. 1952-1962 nghin
cu ti Trung tm Ton hc Amsterdam.
1962-1973 Gio s Ton ti i hc Bch
khoa Eindhoven, Holland v i hc
Texas Austin. Dijkstra l mt trong nhng
ngi i tin phong trong lnh vc lp
trnh, ngi khi xng v t nn mng
cho nguyn l lp trnh cu trc.
DONDIEU.INP DONDIEU.OUT
12
1 5 5 1 3
3 3 5 7 9
1 2
4 7
85
Edsger Wybe Dijkstra
(photo 2002 Hamilton
Richards)
Nhn xt:
on c 1 phn t l on n iu (tng, gim),
on gm mt dy lin tip cc phn t bng nhau l on n iu (tng, gim).
Ta dng hai bin m cc phn t tng hoc bng nhau lin tip, dt v m cc phn t gim hoc
bng nhau lin tip, dg. Nu a
i
= a
i1
ta tng ng thi dt v dg 1 n v. Nu a
i
> a
i1
ta tng dt thm 1 n
v v t li dg = 1. Nu a
i
< a
i1
ta tng dg thm 1 n v v chnh li dt = 1. Sau mi bc ta cp nht on
n iu di nht tm c. Chng trnh Pascal c v x l trc tip file input, chng trnh C# c ton
b d liu vo mng ri x l trn mng.
phc tp: c N.
Cc bin tng th:
n: s lng phn t,
dt: m s phn t trong dy tng,
dg: m s phn t trong dy gim.
iMax: ch s u ca on n iu di nht,
MaxLen: chiu di (s phn t) ca on n iu di nht.
(* Pascal *)
program DonDieu;
uses crt;
const
bl = #32; fn = 'DONDIEU.INP'; gn = 'DONDIEU.OUT';
var f,g: text;
n: integer;
dt,dg: integer;
iMax, MaxLen: integer;
function Max(a,b,c: integer): integer;
begin
if (a < b) then a := b; { a = Max(a,b) }
if (a > c) then Max := a
else Max := c;
end;
procedure XuLi;
var i,m,x,y: integer;
begin
assign(f,fn); reset(f);
readln(f,n); read(f,x);
dt := 1; dg := 1;
MaxLen := 1; iMax := 1;
for i := 2 to n do
begin
read(f,y);
if (y = x) then
begin dt := dt + 1; dg := dg + 1; end
else if (y > x) then
begin dt := dt + 1; dg := 1; end
else { y < x }
begin dg := dg + 1; dt := 1; end;
86
m := Max(MaxLen, dt, dg);
if (m > MaxLen) then
begin MaxLen := m; iMax := i - MaxLen + 1; end;
x := y;
end;
close(f);
end;
procedure Ghi;
begin
assign(g,gn); rewrite(g);
writeln(g, iMax, bl, MaxLen); close(g);
end;
BEGIN
XuLi; Ghi;
END.
// C#
using System;
using System.IO;
using System.Collections;
namespace SangTao2 {
class DonDieu {
const string fn = "DonDieu.inp";
const string gn = "DonDieu.out";
static public int n; // n - so phan tu
static public int imax; // chi so dau tien cua doan max
static public int maxlen; // chieu dai max
static public int [] a;
static void Main(string[] args) {
Doc(); XuLi(); Ghi(); XemKetQua();
Console.WriteLine("\n Fini ");
Console.ReadLine();
}
static public void XemKetQua(): t vit
static public void XuLi(){
imax = 0; maxlen = 1;
int dt = 1, dg = 1;
int m;
for (int i = 1; i < n; ++i){
if (a[i] == a[i - 1]) { ++dt; ++dg; }
else if (a[i] < a[i - 1]) { dt = 1; ++dg; }
else /* a[i] > a[i-1] */ { ++dt; dg = 1; }
m = Max(maxlen, dt, dg);
if (maxlen < m)
{ maxlen = m; imax = i - maxlen + 1; }
}
}
static public int Max(int a, int b, int c){
if (a < b) a = b; // a = Max(a,b)
return (a > c) ? a : c;
}
static public void Doc(): t vit
static public void Ghi(): t vit
} // DonDieu
} // SangTao2
87
Bi 2.13 Ly tha 2, 3 v 5
Dijkstra E.
Vi mi gi tr N cho trc hy sinh N s u tin theo trt t tng dn l tch cc ly tha ca 2, 3
v 5.
D liu vo: tp vn bn LUYTHUA.INP
Cha s t nhin N, 1 s N s 1000.
D liu ra: tp vn bn LUYTHUA.OUT
N s tm c, mi dng mt s.
Thut ton
Gi S l tp cc s cn tm. Ta c
(i) 1 e S
(ii) Nu x e S th 2x, 3x, 5x e S.
Gi s cc phn t trong S c sp tng v ta
tm c phn t th i. Ta k hiu S(i) = { a
1
, a
2
,,a
i
}.
tm phn t th i+1 ta nhn xt
a
i+1
= Min { 2x, 3y, 5z | x, y, z e S(i), 2x > a
i
, 3y >
a
i
, 5z > a
i
}
Ta s dng 3 bin i2, i3, i5 ghi nhn cc ch s
trong S sao cho a
i2
= x, a
i3
= y v a
i5
= z. Cc bin a[1], i2,
i3 v i5 c khi tr 1.
Khi hm Next(i) sinh phn t st sau phn t A[i] s nh sau:
function Next(i: integer): integer;
begin
while (a[i2] * 2 <= a[i]) do i2 := i2 + 1;
while (a[i3] * 3 <= a[i]) do i3 := i3 + 1;
while (a[i5] * 5 <= a[i]) do i5 := i5 + 1;
Next := Min(a[i2]*2, a[i3]*3, a[i5]*5);
end;
(* Pascal *)
(***************************************
LUY THUA cua 2, 3, 5
*************************************)
program LuyThua;
uses crt;
const bl = #32; mn = 1001; fn = 'LUYTHUA.INP'; gn = 'LUYTHUA.OUT';
type ml1 = array[0..mn] of longint;
var f,g: text;
n: integer;
a: ml1;
procedure Doc: t vit;
function Min(a,b,c: longint): t vit;
function Next(i: integer): t vit;
procedure Sinh;
var i: longint;
begin
assign(g,gn); rewrite(g);
LUYTHUA.INP LUYTHUA.OUT
12
1
2
3
4
5
6
8
9
10
12
15
16
88
a[1] := 1; writeln(g,1);
i2 := 1; i3 := 1; i5 := 1;
for i := 2 to n do
begin
a[i] := Next(i-1);
writeln(g,a[i]);
end;
close(g);
end;
BEGIN
Doc; Sinh;
END.
// C#
using System;
using System.IO;
namespace SangTao2 {
/*-------------------------------------------*
Luy thua 2, 3, 5
* ------------------------------------------*/
class LuyThua235 {
const string fn = "LuyThua.inp";
const string gn = "LuyThua.out";
static public int n; // so luong phan tu
static public int[] a;
static void Main(){
Doc(); Sinh(); Ghi(); XemKetQua();
Console.WriteLine("\n fini");
Console.ReadLine();
} // Main
static public void Doc()
{ n = int.Parse(File.ReadAllText(fn).Trim()); }
static public void Sinh(){
a = new int[n];
int i2 = 0, i3 = 0, i5 = 0; a[0] = 1;
int n1 = n-1;
for (int i = 0; i < n1; ++i){ // Next
while (a[i2] * 2 <= a[i]) ++i2;
while (a[i3] * 3 <= a[i]) ++i3;
while (a[i5] * 5 <= a[i]) ++i5;
a[i + 1] = Min(a[i2] * 2, a[i3] * 3, a[i5] * 5);
}
}
static public int Min(int x, int y, int z) : t vit
static public void Ghi(){
StreamWriter g = new StreamWriter(gn);
for (int i = 0; i < n; ++i) g.WriteLine(a[i]);
g.Close();
}
static void XemKetQua(): t vit
} // LuyThua235
} // space
89
Chng 3
Tr chi
Cc bi ton tr chi kh a dng v thng l kh.
Chng ta xt loi tr chi th nht vi cc ga thit sau y:
1. Tr chi gm hai u th l A v B, lun phin nhau, mi ngi i mt nc. Ta lun gi thit
u th i trc l A.
2. Hai u th u chi rt gii, ngha l c kh nng tnh trc mi nc i.
3. u th no n lt mnh khng th i c na th chu thua v vn chi kt thc.
4. Khng c th ha, sau hu hn nc i s xc nh c ai thng, ai thua.
Gi thit chi gii nhm trnh cc trng hp n may, tc l cc trng hp do i phng h
hnh m i lc nc. iu ny tng ng vi gi thit c hai u th u c th tnh trc mi nc i
(vi loi tr chi hu hn) hoc c hai u th u bit cch i tt nht. tin trnh by chng ta gi cc
tr chi loi ny l chi c, mi th ca bn c l mt tnh hung vi d liu c th, ta thng gi l mt
cu hnh.
Cc bi ton tin lin quan n loi tr chi ny thng l:
- Lp trnh xc nh vi mt th c cho trc th ngi i trc (u th A) s thng hay thua.
- Lp trnh my tnh chi vi ngi. D nhin chng trnh bn lp ra l dnh cho my tnh.
- Lp trnh hai my tnh chi vi nhau.
Vi loi tr chi ny c mt heuristic mang tnh ch o sau y:
Trc ht cn xc nh c mt tnh cht T tha cc iu kin sau y:
a) Th thua cui cng tha T,
b) Mi nc i lun lun bin T thnh V = not T,
c) Tn ti mt nc i bin V thnh T.
Tnh cht T c gi l bt bin thua ca tr chi.
Vic chuyn th X thnh not X thng c gi l lt th X. Cc qui tc a - c c th pht biu li
nh sau:
90
T c gi l bt bin thua nu
a') Th thua cui cng tha T,
b') Mi nc i t T u lt T thnh V,
c') Tn ti mt nc i lt V thnh T.
u th no c cch y u th khc vo th
thua T th u th s thng.
u th no khng th y u th khc vo th
thua T th u th s thua.
Nc i y c hiu l nc i hp l tc l nc i tun th cc qui nh ca tr chi, th d
"xe lin, pho cch" trong c tng qui nh rng qun xe c th "n" trc tip cc qun ca i phng
nm trn ng i ca n, cn qun pho th phi "n" qua mt qun m.
im kh nht ca loi ton ny l xc nh bt bin thua.
Bi 3.1. Bc si A
Trn bn c mt ng si N vin, hai u th A v B ln lt i, A i nc u tin. Mi nc i
u th buc phi bc t 1 n M vin si khi bn. u th no n lt mnh khng i ni th thua. C
hai u th u chi rt gii. Vi hai s N v M cho trc hy cho bit A thng (ghi 1) hay thua (ghi 0).
Ta th chi vi M = 3 v vi d liu ban u N = 1, 2 , tnh nc i cho u th A bn hy k
mt bng gm 2 dng. Dng th nht l cc gi tr ca N. Dng th hai c ghi 0 ng vi tnh hung A
thua v 1 cho tnh cho trng hp A thng, nu A l u th i nc u tin.
M = 3 N = 0 1 2 3 4 5 6 7 8 9 10 11 12 13
A thng (1) hay thua (0)? 0 1 1 1 0 1 1 1 0 1 1 1 0 1
Cch i: s vin cn bc chc thng # 1 2 3 # 1 2 3 # 1 2 3 # 1
Mt vi tnh hung cho bi Bc si A, M = 3; # - u hng/bc tm 1 vin
Th d, vi M = 3 cho trc v c nh, A l u th i trc, ta c
N = 0 l mt th thua, v A khng c cch i.
N = 1 l mt th thng, v A s bc 1 vin, B ht cch i.
N = 2 l mt th thng, v A s bc 2 vin, B ht cch i.
N = 3 l mt th thng v A s bc 3 vin, B ht cch i.
N = 4 l mt th thua, v d A bc 1, 2, hoc 3 vin u dn n cc th thng l 3, 2, 1
Lm th no xc nh c bt bin ca tr chi? Phng php n gin l t duy Nhn - Qu
hay l lp lun li. C th l, nu bit kt qu l Q ta hy gng tm nguyn nhn N sinh ra Q. Ta rng,
Qui tc xc nh th thng / thua
T mt th X ang xt,
- nu tm c mt nc i dn n th thua T th X s l th thng V, v
- nu mi nc i t X u dn n th thng th X s l th thua T.
Trc ht ta s tm mt th thua nh nht ca cuc chi hay cn gi l th thua kt hoc th thua
cui cng, v u th no gp th ny u phi u hng v vn chi kt thc.
D thy th thua kt s l N = 0: Ht si, khng th thc hin c nc i no.
91
Vy trc , nhng nc i no c th dn n th thua T(N = 0)?
Do mi u th ch c php bc 1, 2 hoc 3 vin nn cc th thng V trc ch c th l N = 1,
2, hoc 3. Ta vit
T(N = 0) V(N = 1 | 2 | 3) T(N = ?)
trong T l k hiu cho th thua, V l k hiu cho th thng.
Ta th xc nh th thua T(N = ?). D thy vi N = 4 th mi cch bc 1, 2 hoc 3 vin si u dn
n th thng V(N = 3 | 2 | 1). Ta c,
T(N = 0) V(N = 1 | 2 | 3) T(N = 4)
n y ta c th d on bt bin thua s l N = 4k, cho trng hp M = 3, hoc tng qut hn, N
= k(M+1), k > 0.
Vy bt bin thua l:
T: S vin si trong ng l bi ca M+1: N = k(M+1), k > 0.
Ta s chng minh rng nu N = k(M+1), k = 0, 1, 2,th ngi i trc (l A) lun lun thua.
Trc ht rng nu u th A gp s si l bi ca M+1 th vi mi cch i ca A s si cn li
s khng phi l bi ca M+1. Tht vy, mun bo ton tnh cht l bi ca M+1 th A buc phi bc mt
bi no ca M+1, y l iu khng c php v vi phm lut chi.
Gi s N = k(M+1), k > 1. Gi s si A bc l s. Ta c, do 1 s s s M nn B s bc u = (M+1)s
vin si v do s si cn li s li l N = k(M+1) s ((M+1) s) k(M+1)(M+1) = (k1)(M+1). y
l mt bi ca (M+1).
Nu s si l bi ca M+1 th vi mi cch i hp l, s si cn li s khng cn l bi ca M+1.
Nu s si khng phi l bi ca M+1 th lun lun tn ti mt cch i chnh s si tr thnh bi ca
M+1.
Kt lun Bi Bc si A
Nu s si N = k(M+1), k > 0
th u th no i trc s thua.
Vi gi thit A l u th i trc, ta vit hm Ket(N,M) cho ra gi tr 1 nu A thng, ngc li
hm cho gi tr 0 nu A thua. Hm c hai tham bin: N l s vin si trong ng, M l gii hn s vin si
c php bc. Hm n thun ch kim tra xem tr N c l bi ca M+1 hay khng.
(* Pascal *)
function Ket(N,M: integer): integer;
begin
if (N mod (M+1) = 0) then ket := 0 else Ket := 1;
end;
Hm CachDi(N,M) di y m nhn chc nng hng dn ngi chi chn mt cch i. Trc
ht cn kim tra xem th ang xt l thng hay thua. Nu l th thua v cn si th bc 1 vin nhm ko
di thi gian thua. Nu l th thng th bc s si d s si cn li s l bi ca (M+1).
(* Pascal *)
function CachDi(N,M: integer): integer;
var r: integer;
begin
r := N mod (M+1);
if r = 0 then { thua }
begin
if N = 0 then CachDi := 0 else CachDi := 1;
exit;
end;
92
CachDi := r;
end;
// C#
static int Ket(int n, int m) { return (n%(m+1) == 0) ? 0 : 1;}
static int CachDi(int n, int m) {
int r = n % (m+1);
if (r == 0) // thua
return (n == 0) ? 0 : 1;
return r;
}
Bi 3.2. Bc si B
Cho ng si N vin, hai u th A v B ln lt i, A i nc u tin. Mi nc i u th c
php bc t 1 n M vin si. u th no thc hin nc i cui cng th thua. C hai u th u chi
rt gii. Vi hai s N v M cho trc hy cho bit A thng (ghi 1) hay thua (ghi 0).
Ta nhn thy bi ny ch khc bi Bc si A iu kin thua: ai bc qun cui cng s thua.
Chc chn l bn s c th xc nh ngay c bt bin thua ca tr chi ny l
N = k(M+1) + 1, k > 0. Tuy nhin, hnh thnh k nng pht hin lut chi cho cc bi ton kh hn sau
ny, bn hy gng thc hin cc bc tm kim theo cc s sau y:
S 1: Th vi vi d liu ban u: M = 3; N = 1, 2,
M = 3 N = 1 2 3 4 5 6 7 8 9 10 11 12 13
A thng (1) hay thua (0)? 0 1 1 1 0 1 1 1 0 1 1 1 0
Cch i: s vin cn bc
chc thng.
# 1 2 3 # 1 2 3 # 1 2 3 #
Mt vi tnh hung cho bi Bc si B, M = 3; # - u hng/bc tm 1 vin
S 2: Tnh hai hai th thua lin tip theo lp lun li (Nhn - qu).
S tnh hai th thua lin tip
Bc 1 Xc nh th thua nh nht: T (N = 1)
Bc 2 Xc nh cc th thng V dn n T: T V c mt nc i dn n T.
T(N=1) V(N = 2 | 3 | 4)
Bc 3 Xc nh th thua T dn n V: Mi cch i t T u ri vo V.
T(N=1) V(N = 2 | 3 | 4) T(N=5)
Bc 4 Tng qut ha, xy dng v chng minh cng thc xc nh bt bin thua:
N = k(M+1)+1, k > 0
S 3: Tng qut ha (Chi tit ha Bc 4 trong S 2). Trong s 3 di y ta k hiu X(k)
l s vin si ti th X xt trong bc k = 0, 1, 2... X c th l th thng V hoc th thua T, ch rng bc
k c xt theo qu trnh lp lun li ch khng xt theo din tin ca tr chi.
93
Bc 4. Tng qut ha
Bc 4.1 Th thua nh nht: T(0) = 1.
Bc 4.2 Gi thit th thua ti bc k l T(k) (s vin si ngi i trc thua).
Bc 4.3 Xc nh cc th thng V(k) dn n T(k): C mt cch i trn bn cn T(k) vin si.
T(k) V(k) = T(k) + d; 1 s d s M.
Bc 4.4 Xc nh th thua T(k+1) dn n V(k): Mi cch i t T(k+1) u ri vo V(k) = T(k) + d;
1 s d s M:
T(k) V(k) = T(k) + d; 1 s d s M T(k+1) = Max {V(k)}+1 = T(k)+(M+1)
Bc 4.5 Chng minh cng thc T(k) bng qui np: T(k) = k(M+1)+1
D on cng thc: Ta c, theo cng thc thu c Bc 4.4, T(k+1) = T(k)+(M+1),
T(0) = 1;
T(1) = T(0)+(M+1) = 1+(M+1);
T(2) = T(1)+(M+1) = 1+(M+1)+(M+1) = 2(M+1)+1;
T(3) = T(2)+(M+1) = 2(M+1)+1+(M+1) = 3(M+1)+1;
...
D on: T(k) = k(M+1)+1.
Chng mnh bt bin thua: Nu s si trong ng l T(k) = k(M+1)+1, k > 0 th ai i trc s thua.
C s qui np: vi k = 0 ta c T(0) = 0.(M+1)+1 = 1. y l th thua nh nht.
Gi s vi k > 1 ta c th thua l T(k) = k(M+1)+1. Ta chng minh rng T(k+1) = (k+1)(M+1)+1 s
l th thua tip theo v gia hai th thua ny l cc th thng. Tht vy, v T(k) l th thua nn cc th c
dng V(k) = T(k)+d, 1 s d s M s u l th thng. T y suy ra th thua tip sau phi l T(k+1) =
T(k)+M+1 = k(M+1)+1+(M+1) = (k+1)(M+1)+1.
Kt lun Bi Bc si B
Nu s si N = k(M+1)+1, k > 0
th u th no i trc s thua.
Ta cng c th s dng hm f(N) xc nh xem vi ng si c N vin th ngi i trc s thng
(f(N) = 1) hay thua (f(N) = 0). Ta c, f(1) = 0 v vi 1 vin si th ai bc vin s thua. Gi s f(N) = 0.
D thy, khi f(N+d) = 1 vi 1 s d s M, v ch cn bc d vin si l dn n th thua. Tip n
f(N+(M+1)) = 0 v vi mi cch bc s vin si, 1 s s s M i phng s bc tip u = (M+1)s s si
cn li l N vin ng vi th thua. T suy ra f(N) = 0 vi N = k(M+1)+1; cn li l f(N) = 1.
Hai hm Ket(N,M) v CachDi(N,M) vi N > 0 khi s nh sau.
(* Pascal *)
function Ket(N,M: integer): integer; {0: thua; 1: thang}
begin
if (N mod (M+1) = 1) then ket := 0 else Ket := 1;
end;
function CachDi(N,M: integer): integer;
var r: integer;
begin
r := N mod (M+1);
if (r = 1) then { thua: boc tam 1 vien }
94
CachDi := 1 else
if (r = 0)then CachDi := M
else CachDi := r-1;
end;
// C#
static int Ket(int n, int m)// 0: thua; 1: thang
{ return (n % (m+1) == 1) ? 0 : 1; }
static int CachDi(int n, int m) {
int r = n % (m+1);
if (r == 1) // thua, boc tam 1 vien
return 1;
else return (r == 0) ? m : r-1;
}
Bi 3.3. Bc si C
Cho ng si N vin, hai u th A v B ln lt i, A i nc u tin. Ti mi nc i, u th
buc phi bc ti thiu 1 qun, ti a na s qun trong ng. u th no n lt mnh khng i ni th
thua. C hai u th u chi rt gii. Cho bit A thng hay thua.
Ch :
Nu s qun l th bc na non,
ng no cn 1 qun th khng c cch bc ng , v 1 div 2 = 0 trong khi yu cu ca
lut chi l phi bc ti thiu 1 qun.
S 1: Th vi vi d liu ban u: N = 1, 2, 3,
N 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
A thng (1) hay thua (0)? 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1
Cch i: s si cn bc
chc thng
# 1 # 1 2 3 # 1 2 3 4 5 6 7 # 1
Mt vi tnh hung cho bi Bc si C; # - u hng/bc tm 1 vin.
S 2: Kho st hai th thua lin tip theo lp lun li (Nhn - qu).
S tnh hai th thua lin tip
Bc 1 Xc nh th thua nh nht: T (N = 1)
Bc 2 Xc nh cc th thng V dn n T: T V c mt nc i dn n T.
T(N = 1) V(N = 2)
Bc 3 Xc nh th thua T dn n V: Mi cch i t T u ri vo V.
T(N = 1) V(N = 2) T(N = 3)
Bc 4 Tng qut ha, xy dng v chng minh cng thc xc nh bt bin thua:
N = 2
k
1, k > 1
95
S 3: Tng qut ha (Chi tit ha Bc 4 trong S 2). Trong s 3 di y ta k hiu X(k)
l s vin si ti th X xt trong bc k = 0, 1, 2, theo lp lun li t th thua nh nht tr i. X c th l
th thng V hoc th thua T.
Bc 4. Tng qut ha
Bc 4.1 Th thua nh nht: T(0) = 1.
Bc 4.2 Gi thit th thua T(k) c N vin si: T(k) = N.
Bc 4.3 Xc nh cc th thng V(k) dn n T(k): C mt cch i trn bn cn N vin si.
T(k) V(k) = N + d; 1 s d s N.
Bc 4.4 Xc nh th thua T(k+1) dn n V(k): Mi cch i t T(k+1) u ri vo V(k) = N + d;
1 s d s N.
T(k) V(k) = N + d; 1 s d s N T(k+1) = Max {V(k)} + 1 = N+N+1
Bc 4.5 Chng minh cng thc T(k) bng qui np: T(k) = 2
k
1.
Gi T(k) l th thua kho st ti bc th k. Ta c,
Th thua nh nht T(0) = 1: nu c 1 vin si th khng i ni: chu thua.
Gi s th thua ti bc th k l T(k) = N
Khi cc th thng dn n th T(k), theo lut chi s l V(k) = T(k)+d,
1 s d s T(k) v th thua tip sau phi l T(k+1) = T(k)+T(k)+1 = 2T(k)+1.
Tng hp li ta c
T(0) = 1,
T(1) = 2T(0)+1 = 2+1,
T(2) = 2T(1)+1 = 2(2+1) + 1 = 2
2
+2+1,
T(3) = 2T(2)+1 = 2(2
2
+2+1)+1 = 2
3
+2
2
+2+1.
...
p dng cng thc a
k+1
1= (a
k
+ a
k-1
+...+a+1) (a1) ta d on:
T(k) = 2
k
+ 2
k-1
+...+2+1 = (2
k+1
1)/(21) = 2
k+1
1.
Ta dng qui np ton hc chng minh rng T(k) = 2
k+1
1.
Vi k = 0, ta c T(0) = 2
1
1 = 2 1 = 1. Vy T(k) ng vi k = 0.
Gi s T(k) = 2
k+1
1. Ta chng minh T(k+1) = 2
k+2
1.
Ta c, T(k+1) = 2T(k)+1 = 2(2
k+1
1)+1 = 2
k+2
2+1 = 2
k+2
1, pcm.
Kt lun Bi Bc si C
Nu s si N c dng 2
k
- 1, k > 1 th u
th no i trc s thua.
Cc s dng 2
k
1 c gi l s Mersenne mang tn nh ton hc Php th k th XVII, ngi
u tin nghin cu chng.
96
Vi gi thit A l u th i trc, ta vit hm Ket(N) cho ra gi tr 1 nu A thng, ngc li hm
cho gi tr 0 nu A thua. Hm ch n thun kim tra xem N c phi l s Mersenne hay khng. Nu ng
nh vy th u th A s thua, ngc li l A thng.
Marin Mersenne (1588-1648) l con mt gia nh nng
dn Php. Lc u ng hc thn hc v trit hc, sau
chuyn sang nghin cu ton hc v m nhc. ng
li nhng kt qu l th v c s ton hc ca m
nhc, hnh hc v l thuyt s.
Ta rng N = 2
k
1 tng ng vi N+1 = 2
k
. V cc s nguyn trong my tnh u c biu
din di dng nh phn, nn tnh gi tr 2
k
ta ch vic dch s 1 qua tri k bit.
(* Pascal *)
function Ket(N : integer) : integer;
var m,n1: integer;
begin
n1 := N + 1; m := 1;
while (m < n1) do m := m shl 1;
{ m = 2
k
> n1 = N+1 ==> N s 2
k
-1 }
if m = n1 then Ket := 0 else Ket := 1;
end;
Hm CachDi di y s xc nh s si cn bc cho mi tnh hung. Trc ht hm kim tra xem
s si trong ng c phi l s Mersenne hay khng qua h thc N+1 = 2
k
? Nu N = 2
k
1 th ngi no i
s thua, do ta chn cch i chm thua nht bng vic bc 1 vin si. D nhin nu N = 1 th ta phi chu
thua bng cch gn CachDi = 0. Ta xt trng hp N khng phi l s Mersenne. Khi tn ti mt s
nguyn k tha 2
k
1 < N < 2
k+1
1. Ta cn bc bt s si chnh lch l s = N(2
k
1) s si cn li c
dng 2
k
1. Ta chng minh 1 s s s N/2, tc l cch i ny l hp l theo quy nh ca u bi. Tht vy,
do 2
k
1 < N nn s = N(2
k
1) > 1. Mt khc, nu s > N/2 tc l N(2
k
1) > N/2 th N/2 > 2
k
1 hay N >
2
k+1
2. T y suy ra N > 2
k+1
1 mu thun vi iu kin ca k. Vy ta phi c s s N/2.
(* Pascal *)
function CachDi(N : integer) : integer;
var m, n1: integer;
begin
n1 := N + 1; m := 1;
while (m < n1) do m := m shl 1;
{ m = 2
k
> n1 = N+1 ==> N s 2
k
-1 }
97
if m = n1 then { N = 2
k
- 1: Thua }
begin
if N = 1 then CachDi := 0
else CachDi := 1;
exit;
end;
{ m = 2
k
> N+1 }
m := m shr 1;
{ m = 2
k-1
< N+1 < 2
k
= 2m ==> m-1 < N < 2m-1 }
CachDi := N-m+1;
end;
// C#
static int Ket(int n) {
int m = 1,n1 = n + 1;
while (m < n1) m <<= 1;
// m = 2
k
> n1 = n+1 ==> n s 2
k
-1
Ket = (m == n1) ? 0 : 1;
}
static int CachDi(int n) {
int m = 1, n1 = n + 1;
while (m < n1) m <<= 1;
// m = 2
k
> n1 = n+1 ==> n s 2
k
-1
if (m == n1) // Thua
return (n == 1) ? 0 : 1;
// m = 2
k
> n+1
m >>= 1;
// m = 2
k-1
< n+1 < 2
k
= 2m ==> m-1 < n < 2m-1
return n-m+1;
}
Bi 3.4. Chia on
Dng pht biu khc ca Bi Bc si C
Cho mt on thng trn trc s di N n v vi cc im chia nguyn. Hai bn ln lt thc hin
thao tc sau y: Ct on thng ti mt im nguyn nm trong on thu c 2 on con sau vt
i on ngn, trao on di cho ngi kia. Nu hai on bng nhau th vt i mt on ty . Bn no n
lt mnh khng th thc hin c thao tc trn th thua. Hy cho bit bn i trc thng hay thua. Gi
thit rng hai bn u chi rt gii.
Bi 3.5. Bc si D
Cho 2 ng si vi s vin si ln lt l N v M vin. Hai ngi chi A v B, A lun i trc. Lt
chi: Chn ng ty , bc ti thiu 1 vin v ti a c ng. u th no n lt mnh m khng i ni
th thua. Hy cho bit A thng hay thua. Gi thit rng hai u th u chi rt gii.
Thut ton
Bi ny kh d gii.
Bt bin thua cho Bi Bc si
D
S si ca hai ng bng nhau.
98
Nu s si ca hai ng khc nhau th A l u th i trc s cn bng hai ng bng cch chn
ng ln ri bc bt s si chnh lch s si ca hai ng tr thnh bng nhau. Khi B i th s bin hai
ng thnh khc nhau, n lt A li cn bng hai ng
Ta cng d dng vit c hm kt nh sau:
(* Pascal *)
function Ket(N,M : integer) : integer;
begin
if N = M then Ket := 0 else Ket := 1;
end;
Th tc CachDi di y s xc nh ng v s si cn bc cho mi tnh hung. Hm nhn vo l
N - s lng si ca ng th nht v M - s lng si ca ng th hai v cho ra hai gi tr: D - ng si
cn chn v S - s vin si cn bc ti ng . Nu N = M, tc l gp th thua th nh bc 1 vin ti ng
ty chn, mt cch ngu nhin. Ta qui c D = 0 l tnh hung chu thua, tc l khi c hai ng ht si.
(* Pascal *)
procedure CachDi(N, M : integer; var D,S : integer);
{ Dong 1: N vien, Dong 2: M vien soi }
begin
if N = M then { Se Thua }
begin
if N = 0 then D := 0 { Het soi: dau hang }
else
begin { Keo dai cuoc choi }
S := 1; { boc 1 vien }
D := random(2)+1;{tai 1 dong tuy chon}
end;
exit;
end;
{ Tinh huong thang }
if N > M then D := 1 else D := 2; { Chon dong nhieu soi }
S := abs(N-M); { Boc so soi chenh lech }
end;
// C#
static int Ket(int n, int m) {
// ng 1: n vin; ng 2: m vin
return (n == m) ? 0 : 1;
}
static void CachDi(int n, int m, out int s, out int d) {
Random r = new Random();
if (n == m) { // thua
if (n == 0) d = 0;
else {
s = 1;
d = r.Next(2) + 1;
}
}
// n != m: thang
d = (n > m) ? 1 : 2;
s = (d == 1) ? (n m) : (m n);
}
Bn th ngh
Tnh hnh s ra sao nu ta xt li bi ny vi iu kin thu nh sau: u th bc nhng qun cui
cng cn trn bn s thua?
99
Bi 3.6. Bc si E
Cho 2 ng si vi s vin si ln lt l N v M vin. Hai ngi chi A v B, A lun i trc. Lt
chi: Chn ng ty , bc ti thiu 1 vin v ti a c ng. u th no bc nhng qun cui cng cn
trn bn s thua. Hy cho bit A thng hay thua. Gi thit rng hai u th u chi rt gii.
Thut ton
D thy khi mt trong hai ng ch cn 1 vin si, ng th hai c si th ai i trc s thng, v
ngi ch vic bc ht ng si cn li. Ta xt trng hp N, M > 1. Vi trng hp ny ta s dng bt
bin thua T(N=M) v tm cch cn bng hai ng si.
M
N
O O O O O O
1 0 1 1 1 1
C
0 1 1 1 1 1
C
1 1 0 1 1 1
C
1 1 1 0 1 1
1 1 1 1 0 1
C
1 1 1 1 1 0
Gi A l u th i trc, ta k hiu f(N,M) l hm hai bin cho gi tr 1 nu A thng, v gi tr 0
nu A thua, N v M l s si trong hai ng. D thy f l hm i xng, tc l f(N,M) = f(M,N) v trt t
ca hai ng si khng quan trng. tnh tr ca f ta s dng ma trn hai chiu f, cc dng ng vi gi tr
N, cc ct ng vi gi tr M. Ma trn ny i xng qua ng cho chnh, do ta lun gi thit l N s M
v s ln lt in tr theo cc dng, ti mi dng N ta bt u in tr t cc ct M > N tr i. Ta c nhn
xt th v sau y:
* f(1,0) = f(0,1) = f(N,N) = 0, N > 1,
* Cc gi tr cn li trong bng u bng 1.
Hm Ket v th tc CachDi s nh sau.
Bt bin thua cho bi Bc si
E
1. N = M > 1, hoc
2. (0, 1), (1, 0)
function Ket(N,M : integer) : integer;
begin
if (N + M = 1) or ((N = M) and (N > 1))
then Ket := 0 else Ket := 1;
end;
Vi th tc CachDi cho tnh hung thng ta phi xt kh nhiu trng hp.
Trng hp 1. Ch cn mt ng: ta bc ng kia, bt li mt vin.
Trng hp 2. C mt ng cha duy nht 1 vin si: ta bc ht ng kia.
Hai trng hp 1 v 2 c th gp lm 1 nh sau:
Trng hp 1&2. Nu mt ng cn khng qu 1 vin si th bc ng kia s si N+M1.
Trng hp 3. Cn bng s si hai ng bng cch bc s si chnh lch.
100
rng trong c 3 trng hp thng v c trng hp thua ta u chn ng c nhiu si hn
bc.
procedure CachDi(N,M : integer; var D,S : integer);
begin
{ Chon dong nhieu soi }
if N > M then D := 1 else D := 2;
if (N + M = 1) or ((N = M) and (N > 1))then
begin { Se Thua }
S := 1; { boc 1 vien }
exit;
end;
{ Cac tinh huong thang }
if (N < 2) or (M < 2) then S := N+M-1
else S := abs(N-M);
end;
// C#
static int Ket(int n, int m) {
return (n + m == 1 || (n == m && n > 1)) ? 0 : 1;
}
static void CachDi(int n, int m, out int d, out int s) {
d = (n > m) ? 1 : 2;
if (n + m == 1 || (n == m && n > 1)) { // se thua
s = 1; // boc 1 vien
return;
}
s = (n < 2 || m < 2) ? (n+m-1) : Math.Abs(n - m);
}
Bi 3.7. Bc si F
Cho 2 ng si vi s vin si ln lt l N v M vin, N, M > 1. Hai ngi chi A v B, A lun i
trc. Lt chi: Chn ng ty , bc ti thiu 1 vin v ti a na s vin ca ng. u th no n
lt mnh m khng i ni th thua. Hy cho bit A thng hay thua. Gi thit rng hai u th u chi
rt gii.
Thut ton
Mi xem ta thy rng bt bin thua cho bi ny cng l N = M. D on ca bn gn ng v N = M
ch l mt trng hp c bit ca bt bin thua. D thy, nu N = M =1 th ht cch i. Nu N = M > 1 v
A i trc th B ch vic cn bng li s si ca hai ng l chc thng. Vy N = M l mt iu kin thua
(cho ngi i trc).
lp bng tnh tr ca hm f(N,M) ta cng nhn xt rng hm ny i xng, tc l f(N,M) =
f(M,N) v trt t ca cc ng si l khng quan trng. Cng chnh v f(N,M) l hm i xng nn ta ch
cn tnh tr ca f(N,M) vi N s M ri ly i xng qua ng cho chnh ca bng tr. Vi mi N cho trc
ta ln lt in tng dng N ca bng vi M = N, N+1, N+2, Theo nhn xt trn ta c ngay f(N,N) = 0
vi mi N. T th thua ny ta thy ngay f(N,N+d) = 1 vi mi d = 1,2,N v t cc th ny ta c th bc d
vin t ng th hai (ng c M=N+d vin) dn n th thua f(N,N). T y suy ra th thua tip theo s
l f(N,N+N+1) = f(N,2N+1). Tng t, th thua tip sau th ny phi l f(N,2(2N+1)+1) = f(N,2
2
N+2+1).
Tng qat ha ta thu c kt qu sau:
Nu ng si th nht c N vin th cc th thua s c dng f(N,M) vi M = 2
k
N+2
k
1
++2+1 =
2
k
N+(2
k
1
++2+1). p dng cng thc
2
k
1 = (21)(2
k
1
+2
k
2
++2+1) = 2
k
1
+2
k
2
++2+1
ta thu c M = 2
k
N+2
k
1 hay M+1 = 2
k
(N+1).
Vy
101
Bt bin thua cho Bi Bc si F
S si trong hai ng tha h thc
(N+1) = 2
k
(M+1), k > 0 (*)
T h thc (*) ta suy ra N = M l trng hp ring khi k = 0.
Hm Ket v th tc CachDi khi s nh sau.
rng cc s nguyn trong my tnh c biu din di dng nh phn nn gi tr 2
k
tng ng vi
ton t dch tri 1 k bit, 1 shl k.
function Ket(N,M : integer) : integer;
var N1,M1,t: integer;
begin
N1 := N+1; M1 := M+1;
if N1 < M1 then
begin
t := N1; N1 := M1; M1 := t;
end; { N1 > M1 }
while M1 < N1 do M1 := M1 shl 1; { 2*M1 }
if (M1 = N1) then Ket := 0 else Ket := 1;
end;
Vi th tc CachDi cho tnh hung thua th A nh bc 1 vin ng nhiu si. Trong trng hp
thng ta cng chn ng nhiu si bc bt S vin sao cho s si gia hai ng tha h thc (*). Ta tnh
S nh sau. Gi s N > M v k l s nguyn u tin tha h thc N+1 < 2
k
(M+1). Khi , do iu kin
thng nn ta phi c 2
k
1
(M+1) < N+1 < 2
k
(M+1) . Vy s si chnh lch cn bc bt ng nhiu si s l
S = N+12
k
1
(M+1). Ta chng minh rng 1 s S s N/2. Tht vy, v 2
k
1
(M+1) < N+1 nn S =
N+12
k
1
(M+1) > 1. Mt khc, nu S > N/2 th 2S > N hay 2N+22
k
(M+1) > N. T y rt ra N+1 >
2
k
(M+1)1, hay N+1 > 2
k
(M+1), mu thun vi gi thit v k.
procedure CachDi(N,M : integer; var D,S : integer);
var N1,M1,t: integer;
begin
{ N = M = 1: dau hang }
if (N = M) and (N = 1) then
begin
D := 0; S := 0;
exit;
end;
{ Chon dong nhieu soi }
if N > M then D := 1 else D := 2;
N1 := N+1; M1 := M+1;
if N1 < M1 then
begin
t := N1; N1 := M1; M1 := t;
end; { N1 > M1 }
while M1 < N1 do M1 := M1 shl 1; { 2*M1 }
if (M1 = N1) then { Thua }
begin { Se Thua }
S := 1; { boc 1 vien }
exit;
end;
{ Cac tinh huong thang }
M1 := M1 shr 1;
S := N1-M1;
end;
102
// C#
static int Ket(int n, int m) {
if (n < m) {
int t = n; n = m; m = t;
} // n >= m
int n1 = n + 1, m1 = m + 1;
while (m1 < n1) m1 <<= 1;
return (m1 == n1) ? 0 : 1;
}
static void CachDi(int n, int m, out int d, out int s){
// n = m = 1: dau hang
if (n == m && n == 1){
s = d = 0;
return;
}
// Chon dong nhieu soi
d = (n >= m) ? 1 : 2;
int n1 = n + 1, m1 = m + 1;
if (n1 < m1) {
int t = n1; n1 = m1; m1 = t;
}// n1 >= m1
while (m1 < n1) m1 <<= 1;
if (m1 == n1) // thua {
s = 1; // boc 1 vien tai dong d
return;
}
// Cac tinh huong thang
m1 >>= 1; s = n1 - m1;
}
Bi 3.8. Chia Hnh ch nht
Olimpic Quc t
Cho mt li ch nht kch thc NM n v nguyn. Hai bn ln lt thc hin thao tc sau y:
Ct hnh theo mt ng k trong li i qua mt im nguyn trn mt cnh v khng trng vi nh
thu c 2 hnh ch nht sau vt i hnh c din tch nh hn, trao hnh c din tch ln hn cho ngi
kia. Nu hai hnh c din tch bng nhau th vt i mt hnh ty . Bn no n lt mnh khng th thc
hin c thao tc trn th thua. Hy cho bit bn i trc thng hay thua. Gi thit rng hai bn u chi
rt gii.
4.B 5.A 6.
B 3.A
1.A 2.B
Vi hnh ch nht 5 5 u th A s thua sau 6 nc i.
Sau mi ln ct, mnh trng c din tch ln hn
s c giao cho u th tip theo,
mnh xm s c b i.
103
Gi . Bi ny hon ton tng ng nh Bi Bc si F.
Bi 3.9. Bc si G
(Dng tng qut).
Cho N ng si vi s vin si ln lt l S
i
, i = 1,2,,N. Hai ngi chi A v B, A lun i trc. Lt
chi: Chn ng ty , bc ti thiu 1 vin v ti a na s vin ca ng. u th no n lt mnh m
khng i ni th thua. Hy cho bit A thng hay thua. Gi thit rng hai u th u chi rt gii.
Bi 3.10. Chia Hnh hp
(Cho trng hp 3 ng si)
Cho mt li hnh hp ch nht kch thc NMH n v nguyn. Hai bn ln lt thc hin thao
tc sau y: Ct hnh theo mt thit din i qua mt im nguyn trn mt cnh, khng trng vi nh v
vung gc vi cnh thu c 2 hnh hp ch nht sau vt i hnh c th tch nh hn, trao hnh c
th tch ln hn cho ngi kia. Nu hai hnh c cng th tch th vt i mt hnh ty . Bn no n lt
mnh khng th thc hin c thao tc trn th thua. Hy cho bit bn i trc thng hay thua. Gi thit
rng hai bn u chi rt gii.
gii bi 3 ng si chng ta cn mt cht tr gip ca ton hc. Bn xem ba mnh di y
v gii th mt s th d nh, sau th bt tay chng minh cc mnh . Bn cng c th xem li cc
chng minh trnh by trong cc bi gii ni trn.
C s ton hc
nh ngha 1. Cc s t nhin dng 2
k
-1, k = 0, 1, 2, c gi l s Mersenne.
Th d, cc s 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023 l nhng s Mersenne ng vi cc gi tr k = 0, 1,
2, 3, 4, 5, 6, 7, 8, 9 v 10.
Cc s nm gia cc s trn th d, 2, 4, 5, 6, 8, 9, 10, 11, khng phi l s Mersenne.
Mnh 1. Cho s t nhin n. Nu n khng phi l s Mersenne th ta lun lun tm c s t nhin S, 1
s S s n/2 n-S l mt s Mersenne.
Th d,
1. n = 2, S = ?
2. n = 10, S = ?
3. n = 1534, S = ?
Gi . Xc nh k 2
k
< n+1 < 2
k+1
. Sau tnh S = n+1-2
k
.
p n: 1. S = 1; 2. S = 3; 3. S = 511.
Cho 2 s t nhin n v m. Xt h thc
n + 1 = 2
k
(m + 1), k = 0, 1, 2, (*)
Mnh 2
a) Hai s Mersenne bt k u tha h thc (*).
b) C nhng cp s t nhin tha h thc (*) nhng khng phi l s Mersenne.
c) Nu cp s t nhin n v m tha h thc (*) v mt trong hai s l s Mersenne th s kia cng
phi l s Mersenne.
Gi
a) n= 2
a
-1, m = 2
b
-1,a > b n+1 = (m+1).2
a-b
.
b) Th d, 5 v 11: (11+1) = (5+1).2
1
, Vi mi a, b nguyn: 5 = 2
a
-1, 11 = 2
b
-1.
c) n+1 = (m+1).2
k
, n = 2
a
-1 2
a
= (m+1).2
k
hay m = 2
a-k
1.
Mnh 3. Cho 2 s t nhin n v m, n > m. Nu n v m khng tha h thc (*) th ta lun lun tm c
s S, 1 s S s n/2 nS v m tha h thc (*).
Th d,
1. n = 12, m = 3 , S = ?
104
2. n = 50, m = 5, S = ?
3. n = 54, m = 6, S = ?
p n: 1. S = 5; 2. S = 3; 3. S = 27.
Gi . Xc nh k max 2
k
(m+1)< n+1. Sau tnh S = n+12
k
(m+1).
Tip theo s l bi ton bc nhiu ng si vi lut bc s qun khng hn ch trong mt ng duy
nht chn.
Bi 3.11. Tr chi NIM
Tr chi NIM c xut x t Trung Hoa, dnh cho hai u th A v B vi cc nc i ln lt an nhau
trn mt u trng vi N ng si. Ngi no n lt i th c chn ty mt ng si v bc ti
thiu l 1 vin, ti a l c ng chn. Ai n lt mnh khng th thc hin c nc i s thua. Ta
gi thit l A lun i trc v hai u th u chi rt gii. Cho bit A thng hay thua?
Thut ton
Gi s vin si trong cc ng l S
1
, S
2
,, S
N
.
K hiu l tng loi tr (xor). t x = S
1
S
2
S
N
. Ta chng minh rng bt bin thua ca
tr chi NIM l x = 0, tc l nu x = 0 th n lt ai i ngi s thua.
Trc ht nhc li mt s tnh cht ca php ton theo bit.
1) a b = 1 khi v ch khi a b.
2) a 0 = a
3) a 1 = not a
4) Tnh giao hon: a b = b a
5) Tnh kt hp: (a b) c = a (b c)
6) Tnh ly linh: a a = 0
7) a b a = b
8) Tnh cht 7 c th m rng nh sau: Trong mt biu thc ch cha php xor ta c th xa i chn
ln cc phn t ging nhau, kt qu s khng thay i.
d nh ta gi php ton ny l so khc so xem hai i tng c khc nhau hay khng. Nu
khc nhau l ng (1) ngc li l sai (0).
Bt bin x = 0 c ngha nh sau: Nu vit cc gi tr S
i
, i = 1..N di dng nh phn vo mt bng
th s lng s 1 trong mi ct u l s chn.
Bng bn cho ta S
1
S
2
S
3
S
4
S
5
= 1314672 = 0.
Nu x l tng xor ca cc S
i
, i = 1..N, vi mi i = 1..N ta k hiu
K(i) l tng xor khuyt i ca cc S
i
vi cch tnh nh sau: K(i) = S
1
S
2
S
i-1
S
i+1
S
N
. Nh vy K(i) l tng xor ca cc S
j
sau khi
loi tr phn t S
i
v x chnh l tng xor ca cc S
i
, i = 1..N. Do S
i
S
i
= 0 v 0 y = y vi mi y nn K(i) = x S
i
. cho tin, ta cng
k hiu K(0) chnh l tng xor ca cc S
i
, i = 1..N. Vi th d cho
ta tnh c cc tng khuyt nh sau:
K(0) = S
1
S
2
S
3
S
4
S
5
= 1314672 = 0.
K(1) = S
2
S
3
S
4
S
5
= 14672 = 13,
K(2) = S
1
S
3
S
4
S
5
= 13672 = 14,
K(3) = S
1
S
2
S
4
S
5
= 131472 = 6,
K(4) = S
1
S
2
S
3
S
5
= 131462 = 7,
K(5) = S
1
S
2
S
3
S
4
= 131467 = 2.
Ta pht hin c qui lut l th sau y:
Dng nh phn
S1 = 13 1 1 0 1
S2 = 14 1 1 1 0
S3 = 6 0 1 1 0
S4 = 7 0 1 1 1
S5 = 2 0 0 1 0
x = 0
0 0 0 0
105
Mnh 1. Cho x l tng xor ca N s t nhin, S
i
, x = S
1
S
2
...S
N
. Khi K(i) = x S
i
, i =
1,2,...,N. Tc l mun b mt s hng trong tng ta ch vic thm tng vi chnh s hng . Ni
ring, khi x = 0 ta c K(i) = S
i
, i = 1,2,...,N.
Chng minh
Gi x l tng xor ca cc s cho, x = S
1
S
2
...S
N
. Vn dng nh giao hon v tnh ly ng
ta c th vit x S
i
= (S
1
S
2
...S
i-1
S
i+1
S
N
)(S
i
S
i
) = K(i) 0 = K(i), i = 1,2,...,N, pcm.
Ta chng minh tip cc mnh sau:
Mnh 2. Nu x 0 th c cch i hp l bin i x = 0.
Chng minh
Do x = 0 nn ta xt ch s 1 tri nht trong dng biu din nh phn ca x = (x
m
, x
m-1
,,x
0
), x
j
= 1, x
i
= 0, i > j. Do x l tng xor ca cc S
i
, i = 1..N, nn tn ti mt S
i
= (a
m
, a
m-1
,,a
0
) ch s a
j
= 1. Ta chn
ng S
i
ny (dng c du *). Khi , ta tnh c K(i) = x S
i
= (x
m
a
m
, x
m-1
a
m-1
,,x
0
a
0
) = (b
m
, b
m-
1
,,b
0
) vi b
i
= x
i
a
i
, 0 s i s m. Ta c nhn xt sau y:
* Ti cc ct i > j: b
i
= a
i
, v b
i
= x
i
a
i
= 0 a
i
= a
i
,
* Ti ct j ta c: b
j
= 0, v b
j
= x
j
a
j
= 1 1 = 0.
Do a
j
= 1, b
j
= 0 v mi v tr i > j u c b
i
= a
i
nn S
i
> K(i). Nu ta thay dng S
i
bng dng K(i)
th tng xor y khi s l
y = (x S
i
) K(i) = K(i) K(i) = 0.
Vy, nu ta bc ti ng i s vin si v = S
i
K(i) th s si cn li
trong ng ny s l K(i) v khi tng xor s bng 0, pcm.
Mnh 3. Nu x = 0 v cn ng si khc 0 th mi cch i hp l
u dn n x 0.
Chng minh
Cch i hp l l cch i lm gim thc s s si ca mt ng
S
i
duy nht no , 1 s i s N. Gi s ng c chn l S
i
= (a
m
, a
m-
1
,,a
0
). Do S
i
b sa nn chc chn c mt bit no b o (t 0
thnh 1 hoc t 1 thnh 0). Ta gi bt b sa l a
j
. Khi tng s bt
1 trn ct j s b tng hoc gim 1 n v v do s khng cn l s
chn. T suy ra rng bit j trong x s l 1, tc l x 0 pcm.
Phn lp lun ch yu trong mnh 2 nhm mc ch ch ra s tn ti ca mt tp S
i
tha tnh cht
S
i
> xS
i
. Nu tm c tp S
i
nh vy ta s bc S
i
(xS
i
) vin ti ng si i.
Gi thit rng mng S[1..N] kiu nguyn cha s lng si ca mi ng khi to nh mt i tng
dng chung, ta vit hm Ket v th tc CachDi nh sau.
Hm Ket s cho ra gi tr l tng xor x ca cc ng si. Nh vy, khi x = 0 th ngi no i s thua,
ngc li, khi x 0 th ngi no i s thng.
function Ket(N: integer): integer;
var x, i: integer;
begin
x := 0;
for i := 1 to N do x := x xor S[i];
Ket := x;
end;
Th tc CachDi hot ng nh sau:
Gi hm x = Ket. Nu x = 0 tc l s thua th chn mt ng cn si, th d ng cn nhiu si nht,
bc tm 1 vin nhm ko di cuc chi. Nu x = 0 v cc ng u ht si th ng nhin l phi chu
thua. Trng hp x = 0 th ta tm cch i chc thng nh sau:
Bc 1. Tm ng si i tha iu kin x S
i
< S
i
.
Bc 2. Bc ti ng i S
i
(xS
i
) vin.
Dng nh phn
x3 x2 x1 x0
S1 = 12 1 1 0 0
S2 = 14 1 1 1 0
* S3 = 6 0 1 1 0
S4 = 3 0 0 1 1
S5 = 2 0 0 1 0
x = 5
0 1 0 1
106
procedure CachDi(N: integer; var D,V: integer);
var x,i: integer;
begin
x := Ket(N);
if x = 0 then { Thua }
begin
D := 1;
for i := 2 to N do
if (S[i] > S[D]) then D := i;
if (S[D] = 0) {Het soi: Dau hang}
then D := 0
else S := 1;
exit;
end;
{ Chac thang }
for D:=1 to N do
if (s[D] > (x xor S[D])) then
begin
V := S[D]-(x xor S[D]); {boc V vien tai dong D }
exit;
end;
end;
Trong cc hm C# di y mng s c khai bo n phn t, cc phn t c m s t 0 n n1, trong
khi cc ng si c m s t 1 n n do chng ta phi lu chuyn i ch s cho thch hp
// C#
static int Ket() {
int x = 0;
for (int i = 0; i < s.Length; ++i) x ^= s[i];
return x;
}
static int CachDi(ref int d, ref int v) {
int x = Ket();
if (x == 0) { // Thua
d = 0;
for (int i = 1; i < s.Length; ++i)
if (s[i] > s[d]) d = i;
// s[d] = Max(s[i] | i = 0..n-1)
if (s[d] > 0){ v = 1; ++d; }
return x;
}
// Thang
for (d = 0; d < s.Length; ++d)
if ((x ^ s[d]) < s[d]){
v = s[d] - (x ^ s[d]);
++d;
return x;
}
return x;
}
Bi 3.12. C bng
Bn c l mt tm bng ch nht N dng m s t trn xung ln lt l 1, 2,...,N v M ct m s t
tri sang ln lt l 1,2,...,M; 2 s N s 500, 2 s M s 50. Mt qun c @ c t ti dng x, ct y. Hai u
th A v B lun phin mi ngi i mt nc nh sau: buc phi chuyn qun c @ t ct hin ng l y
107
sang ct k ty chn nhng phi khc ct y. Vic chuyn ny phi c thc hin nghim ngt nh sau:
trc ht y ngc qun c @ ln k dng. Nu qun c vn cn trong bng th r phi hoc tri t
qun c vo ct k, ngc li nu qun c ri ra ngoi bng th coi nh thua.
Nh vy, nu qun c ang t ti v tr (x,y) mun chuyn qun c sang ct k = y th trc ht phi
y qun c n dng x-k. Nu x-k > 1 th c php t qun c vo v tr mi l (x-k,k).
Gi thit A lun lun l u th i nc u tin v hai u th u chi rt gii. Bit cc gi tr N,
M, x v y. Hy cho bit A thng (ghi 1) hay thua (ghi 0)?
Vi N = 8, M = 4, qun c @ t ti v tr xut pht (7,2) v A i trc ta
thy A s thng sau 3 nc i an xen tnh cho c hai u th nh sau:
1. A chuyn @ t v tr @(7,2) sang v tr A
1
(4,3)
2. B chuyn @ t v tr A
1
(4,3) sang v tr B
2
(3,1)
3. A chuyn @ t v tr B
2
(3,1) sang v tr A
3
(1,2)
B chu thua v ht cch i!
Thut ton
Ta th vn dng k thut Nhn - Qu in tr 1/0 vo mi (i, j)
ca bng a vi ngha nh sau: nu gp th c c qun c @ t ti v tr (i, j) th
ai i trc s thng (1) hay thua (0). Ta s duyt theo tng dng t 1 n N, trn
mi dng ta duyt t ct 1 n ct M.
Ta c nhn xt quan trng sau y. Nu (i, j) = 0 tc l gp th thua th
cc i n c ny s l nhng th thng. chnh l cc (i+j, k) vi 1 s k
s M v k = j.
T nhn xt ny ta vit ngay c hm Ket - kim tra
xem ngi i trc vi qun c @ ti (x,y) trn bn c NM
s thng (1) hay thua (0).
Trc ht ta lp y tr 0 cho bng - mng hai chiu
a[1..N, 1..M] kiu byte, sau ln lt duyt cc phn t ca
bng v in tr 1 theo nhn xt trn.
function Ket(x,y: integer): integer;
var i,j,k: integer;
begin
fillchar(a,sizeof(a),0);
for i := 1 to x-1 do
for j := 1 to Min(x-i,M) do
if (a[i,j] = 0) then
{ in 0 cho cc (i+j, k); k=1..M, k = j }
for k := 1 to M do
if (k <> j) then a[i+j,k] := 1;
Ket := a[x,y];
end;
Thut ton trn i hi phc tp c N.M
2
.
O O O O O O O O
0 0 0 0 0 0 0 0
C 0 0 0 0 0 1 1 1
C 0 0 0 0 1 1 1 1
0 0 0 0 1 1 0 1
C 0 0 0 0 1 1 1 0
C 0 0 0 0 0 0 0 0
s O O O O
A
3
C
C
B
2
A
1
C
C
C @
Nhn xt
Nu [i, j] = 0 th mi trn dng i+j,
tr (i+j, j) u nhn tr 1.
[i, j] = 0 [i+j, k] = 1, k = 1..M, k = j.
108
C 0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0
Lp y 0 (bng tri) ri in tr (bng phi)
cho c bng N = 8, M = 4.
Kt qu vi x = 7, y = 2: a[7,2] = 1 (A thng).
tham gia cuc chi vi cc gi tr N, M v (x,y) cho trc d nhin bn cn tnh trc bng a
theo th tc Ket ni trn. Sau , mi ln cn i bn chn nc i theo hm CachDi nh m t di y.
Hm nhn vo cc gi tr N, M l kch thc dng v ct ca bng; dng sx, ct sy l v tr ang xt ca
qun c @ v cho ra mt trong ba gi tr loi tr nhau nh sau:
CachDi = 1 nu tm c mt v tr chc thng (nx,ny) t qun c;
CachDi = 0 nu khng th tm c v tr chc thng no nhng cn nc i do buc phi i
n v tr (nx,ny);
CachDi = -1 nu ht cch i, tc l chp nhn thua kt thc vn c.
Ta thy sau khi gi th tc Ket th dng u tin ca bng a cha tan 0 v phn t a[2,1] cng
nhn tr 0. l nhng th buc phi u hng v ht cch i. Vy tnh hung u hng (hay ht cch i)
s l
sx = 1, hoc
sx = 2 v sy = 1.
Ngoi ra, do th tc Ket c gi, tc l bng a c in th hin mi cch i ca cuc chi
nn a[sx,sy] cho ta ngay gi tr chc thng hoc chc thua ca tnh hung xut pht t (sx,sy).
Nu a[sx,sy] = 0 ta nh chn nc i c th thua chm theo Heuristic sau y: Tm cch y qun
c @ t v tr (sx,sy) ln cng t cng tt.
Nu a[sx,sy] = 1 ta chn nc i c th thng nhanh theo Heuristic sau y: Tm cch y qun c
@ t v tr (sx,sy) ln cao nht c th c, tc l ln v tr (nx, ny) tha ng thi cc iu kin
a[nx, ny] = 0,
nx cng nh cng tt.
Sau ny ta s thy cc Heuristics trn ch l mt cch i tt ch cha phi l cch i ti u.
function CachDi(M, sx, sy: integer; var nx,ny: integer): integer;
begin
if (sx = 1) or ((sx = 2) and sy = 1)) then
begin { Het cach di: Dau hang }
CachDi := -1;
exit;
end;
CachDi := a[sx,sy];
if CachDi = 0 then { Con nuoc di nhung se thua }
for ny := 1 to Min(sx-1,M) do
if (ny <> sy) then
begin
nx := sx ny;
exit;
end;
{ Chac thang }
for ny := Min(sx-1,M) downto 1 do
if (ny <> sy) then
if (a[sx-ny,ny] = 0) then
begin { chac thang }
nx := sx ny; exit;
end;
end;
109
end;
Hm Min(a,b) cho ra gi tr min gia hai s a v b cn dc m t trc nh sau:
function Min(a,b: integer): integer;
begin
if (a < b) then Min := a else Min := b;
end;
Chng trnh C# di y m t mt vn C Bng 50 7 gia hai u th A (i trc) v B. Qun
c xut pht ti v tr (49,5). Vn ny A s thng.
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1 {
class Program {
static int maxn = 501, maxm = 51;
static int[,] a = new int [maxn,maxm];
static void Main(string[] args){
Game(50, 7, 49, 5);
Console.WriteLine("\n \n Fini");
Console.ReadLine();
}
static void Game(int n, int m, int x, int y) {
Console.WriteLine("\n The co " + n +
" X "+m+" @ = ("+x+","+y+")");
Ket(m, x, y);
Show(a, x, m);
while (true) {
Console.Write("\n A: ( " + x + " , " + y + " ) ");
if (CachDi(m, x, y, ref x, ref y) == -1) {
Console.Write("Dau hang !!!");
Console.ReadLine();
return;
}
else Console.Write(" ==> ( " + x + " , " + y + " ) ");
if (Console.Read() == '.') return;
Console.Write("\n B: ( " + x + " , " + y + " ) ");
if (CachDi(m, x, y, ref x, ref y) == -1) {
Console.Write("Dau hang !!!");
Console.ReadLine();
return;
}
else Console.Write(" ==> ( " + x + " , " + y + " ) ");
if (Console.Read() == '.') return;
} // while
}
static int CachDi(int m, int sx, int sy, ref int nx, ref int ny)
{
if (sx == 1 || (sx == 2 && sy == 1)) return -1;
if (a[sx, sy] == 0) { // Di duoc, nhung thua
for (ny = 1; ny <= Min(sx-1,m);++ny)
if (ny != sy) { nx = sx - ny; return 0; }
}
for (ny = Min(sx-1,m); ny > 0; --ny)
if (ny != sy)
if (a[sx - ny, ny] == 0) // Chac thang
{ nx = sx - ny; return 1; }
110
return 0;
}
static int Min(int a, int b) { return (a < b) ? a : b; }
static int Ket(int m, int x, int y) {
Array.Clear(a,0,a.Length);
for (int i = 1; i < x; ++i) { // voi moi dong i
int minj = Min(x - i, m);
for (int j = 1; j <= minj; ++j) // xet cot j
if (a[i, j] == 0)
for (int k = 1; k <= m; ++k)
if (k != j) a[i + j, k] = 1;
}
return a[x, y];
}
static void Show(int[,] s, int n, int m) {
Console.WriteLine();
for (int i = 1; i <= n; ++i) {
Console.Write("\n"+i+". ");
for (int j = 1; j <= m; ++j)
Console.Write(a[i, j] + " ");
}
}
}// Program
}
Nu N c kch thc ln, th d, c triu dng, cn s ct M vn nh, th d M s 50 v ra ch
yu cu cho bit ngi i trc thng hay thua ch khng cn l gii tng nc i th ta vn c th s dng
mt mng nh c 5151 phn t gii bi ton trn. Ta khai bo kiu mng nh sau:
const mn = 51;
type
MB1 = array[0..mn] of byte;
MB2 = array[0..mn] of MB1;
var a: MB2;
N: longint;
M: integer;
....
Ta s dng mng index di y chuyn i cc s hiu dng tuyt i thnh s hiu ring trong
mng nh a. bn ch cn lu nguyn tc sau y khi x l cc php thu gn khng gian: Khng ghi vo
vng cn phi c d liu. Thc cht y l mt hm bm cc gi tr i trong khong 1..N vo min 0..M
bng php chia d: i (i-1) mod (M+1) nh m t trog hm index.
function index(i,M: integer): integer;
begin
index := i mod (M+1);
end;
function Ket(M: integer;
x: longint; y: integer): integer;
var i: longint; j,k: integer;
begin
fillchar(a,sizeof(a),0);
for i:= 1 to x-1 do
begin
k := index(i+M,M);
fillchar(a[k],sizeof(a[k]),0);
for j:=1 to Min(x - i, M)do
if (a[index(i,M),j] = 0) then
for k := 1 to M do
111
if (k <> j) then
a[index(i+j,M),k] := 1;
end;
Ket := a[index(x,M),y];
end;
//C#
static int Index(int i, int m) { return i % (m + 1); }
static int Ket(int m, int x, int y){
int id, Minj, i, j, k, v ;
Array.Clear(a, 0, b.Length);
for (i = 1; i < x; ++i) {
id = Index(i + m, m);
for (v = 1; v <= m; ++v) a[id, v] = 0;
minj = Min(x - i, m);
for (j = 1; j <= minj; ++j) // xet cot j
if (a[Index(i, m), j] == 0)
for (k = 1; k <= m; ++k)
if (k != j) a[Index(i + j, m), k] = 1;
}
return a[Index(x,m), y];
}
n y ta th m rng iu kin ca bi ton nh sau: Hy cho bit, vi cc gi tr cho trc l
kch thc bng N M, v tr xut pht ca qun c @ (x,y) v u th A i trc th A thng hoc thua sau
bao nhiu nc i ?
Nguyn tc ca cc tr chi i khng
Nu bit l thng th tm cch thng nhanh nht,
Nu bit l s thua th c ko di cuc chi
c th thua chm nht.
Ta vn s dng bng A in tr vi cc qui c mi sau y:
Nu t (i, j) ngi i trc c th thng sau b nc i th ta t a[i,j] = +b; ngc li nu t ny
ch c th dn n th thua sau ti a b nc i th ta t a[i,j] = b. Mt nc i l mt ln di chuyn qun
c ca mt trong 2 ngi chi. Ta cng qui c a[i,j] = 0 c ngha l u th xut pht t (i,j) s ht cch
i do chp nhn thua ngay. K hiu (i,j) (u,v) nu c nc i hp l t (i,j) sang (u,v). T nguyn
tc ca cc tr chi i khng ta suy ra
(1) Nu t (i,j) c nhng nc i hp l dn n th (lm cho i phng) thua th ta chn
cch thng nhanh nht bng cch t
a[i,j] = min { a[u,v] | (i,j) (u,v), a[u,v] s 0 } + 1
(2) Nu t (i,j) mi nc i hp l u dn n th (to cho i phng thng) th ta phi
chn cch thua chm nht bng cch t
a[i,j] = (max { a[u,v] | (i,j) (u,v), a[u,v] > 0 } + 1)
1 2 3 4
1 0 0 0 0
112
Sau khi lp y 0 cho bng a ta ln lt duyt cc dng i t 1 n x. Vi mi
dng ta duyt cc ct j t 1 n M. Nu gp tr a[i,j] = 0 ta hiu l v tr ny s dn
n thua. Ta cn tnh s bc thua chm nht ri gn cho a[i,j]. Tip n, do v tr
(i,j) l thua nn ta phi cp nht li cc gi tr a[u,v] ng vi cc v tr (u,v) (i,j).
Bn th in tr cho bng a vi N = 12, M = 4. Trong th d ny, a[8,2] = - 4
c ngha l nu qun c @ t v tr (8,2) th ngi i trc s thua sau 4 nc
i. Tht vy, gi A l ngi i trc, ta thy nu A di chuyn @ n (7,1) th B s
i tip thng sau 3 nc i; A khng th n dng 6 (?). Nu A n (5,3) th B
s i tip thng sau 1 nc. Nu A n (4,4) thi B s i tip 1 nc na n
(1,3) l thng.
Ti sao trong hm Ket ta phi tnh th thua trc khi tnh th thng. V khi
gp a[i,j] = 0 th ta cn cp nht gi tr ny bit c l s thua sau bao nhiu
nc i. Sau , do c ch lp lun li, ch khi no ta bit s nc thua ti a[i,j] th
mi tnh tip c cc th thng dn n h thua ny.
function Ket(M,x,y: integer): integer;
var i, j: integer;
begin
fillchar(a,sizeof(a), 0);
for i := 1 to x do
for j := 1 to M do
if (a[i,j] = 0) then
begin
TinhNuocThua(M,i,j);
TinhNuocThang(M,x,i,j);
end;
Ket := a[x,y];
end;
Procedure TinhNuocThua(M,i,j: integer);
var k, vmax: integer;
begin
vmax := -1;
for k := 1 to Min(i-1,M) do
if (k <> j) then
vmax := Max(vmax, a[i-k,k]);
a[i,j] := -(vmax + 1);
end;
Procedure TinhNuocThang(M,x,i,j: integer);
var k, d, v: integer;
begin { Xet dong i+j }
d := i+j;
if (d <= x) then { quan co con trong vung can xu ly }
begin
v := -a[i,j] + 1;
for k := 1 to M do
if (k <> j) then
if (a[d,k] > 0) then a[d,k] := Min(a[d,k], v)
else a[d,k] := v;
end;
end;
// C#
static int Ket(int n, int m, int x, int y) {
Array.Clear(a, 0, a.Length);
for (int i = 1; i <= x; ++i) { // voi moi dong i
for (int j = 1; j <= m; ++j) // xet cot j
2 0 1 1 1
3 1 1 1 1
4 1 1 -2 1
5 1 1 1 -2
6 -2 -2 -2 -2
7 3 3 3 3
8 3 -4 3 3
9 3 3 3 3
10 3 3 3 5
11 -4 -4 -4 -4
12 -4 5 5 5
Tab Game vi
N = 12, M = 4.
113
if (a[i, j] == 0) {
TinhNuocThua(m, i, j);
TinhNuocThang(m, x, i, j);
}
}
return a[x,y];
}
static void TinhNuocThua(int m, int i, int j) {
int vmax = -1, km = Min(i-1,m);
for (int k = 1; k <= km; ++k)
if (j != k) vmax = Max(vmax, a[i - k, k]);
a[i,j] = -(vmax + 1);
}
static void TinhNuocThang(int m, int x, int i, int j){
int d = i + j;
if (d > x) return;
int vmin = -a[i,j]+1;
for (int k = 1; k <= m; ++k)
if (k != j)
a[d,k] = (a[d, k] > 0) ? Min(a[d, k], vmin) : vmin;
}
Vi N c triu v M nh bn cng c th vn dng cc k thut tng t nh trnh by c
th tnh s nc thng/thua, tuy nhin trong trng hp ny bn phi khai bo mng a rng gp i, tc l a
phi cha 2M+2 dng gm M dng trc dng ang xt v M dng sau dng ang xt. cc dng trc v
sau ny dng cp nht s nc i thng/thua.
n y ta c th s dng thut ton C bng gii bi C y
sau y.
Bi 3.13. C y
Bn c l mt gii bng chia m s t 1 n N. Hai u th A v
B an xen nhau, mi ngi i mt nc, A lun i trc. Mt qun c @
t cnh x. Ti nc i th i phi y qun c ln (v pha ch s nh) d
i
, 1 s d
i
s M v khng c lp li cch va i ca u th trc, tc l
d
i
= d
i-1
. u th no n lt mnh khng i ni th thua. Gi thit l hai
u th u chi rt gii. Bit N, M, x v A l u th i trc. Hy cho
bit
a) A thng (ghi 1) hay thua (ghi 0).
b) A thng hay thua sau bao nhiu ni i?
Gi s hai u th i v nc i vi mc y ln lt l d
1
, d
2
,..., d
v
th gi thit ca bi cho bit hai mc y k nhau l d
i-1
v d
i
phi khc
nhau. Gi s bn c c N = 12 , qun c t cnh x = 7, mi nc i
phi di chuyn qun c ln 1, 2.., hoc M = 4 v khng c lp li nc
va i ca ngi trc. Nu A i trc th s c th thng sau ti a 4 nc
i. Chng hn, A i ln 1 bc d
1
= 1 n 6. B c th chn mt trong 3
cch i ng vi d
2 =
2, 3, hoc
4. n 4, 3 hoc 2. Nu B chn d
2
=
2 n 4 th A di chuyn ln theo d
3
= 3 n 1 khin cho B thua.
Nu B chn d
2
= 3 n 3 th A di chuyn ln theo d
3
= 2 n 1
khin cho B thua. Cui cng, nu B chn d = 4 n 2 th A di chuyn ln theo d
3
= 1 n 1 khin
cho B thua. cc gi tr d
i
theo tng phng n khi l nh sau:
Phng n 1: (1, 2, 3).
Phng n 2: (1, 3, 2).
Phng n 3: (1, 4, 1).
Thut ton
0 1 2 3 4
1 0 0 0 0
2 0 1 1 1
3 1 1 1 1
4 1 1 -2 1
5 1 1 1 -2
6 -2 -2 -2 -2
7 @ 3 3 3 3
8 3 -4 3 3
9 3 3 3 3
10 3 3 3 5
11 -4 -4 -4 -4
12 -4 5 5 5
C y N = 12, M = 4, x = 7
v Tab Game tng ng.
114
Chng ta hy thit lp s tng ng gia c y v c bng v ch ra rng A thng c y khi v ch
khi A thng c bng tng ng. C y N , gii hn bc i M v xut pht x tng ng vi c bng N
di, M ngang v v tr xut pht (x,y) trong y = d
1
l nc i hp l u tin n 1 thua, x := x-d
1
.
C mt cch t duy c th d dng tnh c (x,y) nh sau. Ta thm cho c bng mt gi mang
m s 0 v qui nh rng qun c bng xut pht ti (x,0) - dng v, ct 0. Sau , trong cuc chi vi c
bng ny khng ai c php di chuyn n ct 0. Nu A i u tin th chc chn s di chuyn t (x,0)
n mt m B chc thua. Trong th d ny, nc i u tin ca A s l (7,0) (6,1), tc l chuyn qun
c t ct 0 sang ct 1.
Bi c y mi xem tng nh n gin nhng gii c ta li phi xt bi kh hn nhng c li
gai trong sng, d hiu
Bi 3.14. Bc si H
Dng pht biu khc ca bi C y
Cho ng si N vin, hai u th A v B ln lt i, A i nc u tin. Mi nc i u th buc
phi bc ti thiu 1 vin, ti a M vin trong ng v khng c lp li nc va i ca ngi trc. Th
d, nu u th A va bc v vin si th n lt mnh, u th B khng c bc v vin na. u th no
n lt mnh khng i ni th thua. C hai u th u chi rt gii. Cho bit a) A thng hay thua. b) A
thng hay thua sau bao nhiu ni i?
115
Chng 4
Cc thut t on sp t
4.1 C tam ti
Olimpic quc t
Mt s quc gia nh Ba Lan, B, Php c
quc k to t ba gii mu thng c gi l c
tam ti. Ba bn tr A, B v C chi tr ghp hnh
to thnh mt l c tam ti vi ba gii mu dc ln
lt tnh t tri qua phi l xanh (X), trng (T) v
(D). Mt bn ghp c c kch thc 2N 3N
vung n v c k sn thnh li vung vi
m s cc hng tnh t trn xung di l 1, 2,,
2N v m s cc ct tnh t tri qua phi l 1, 2,,
3N. u tin bn A chn mt trn ct 1 c ta
l (Ax, Ay = 1), bn B chn mt trn dng cui
cng c ta l (Bx=2N, By), bn C chn mt
trn ct cui cng c ta l (Cx, Cy = 3N). Sau
ln lt theo th t quay vng A, B, C ba bn
chn cc mnh ghp n v 1 1 vi mu ph hp
t vo cc trong bn c. Ln u tin mi
bn t mt mnh ghp vo chn. Nhng ln tip theo, n lt mnh, mi bn t mt s mnh ghp
k vi mnh ghp do chnh bn y t ti ln trc. D nhin, mi trn bn ch c t ng 1 mnh
ghp. Bn no khng th ghp c th bn ngng chi, nhng ngi cn li s tip tc chi n khi
hon thnh l c. Bit cc gi tr N, Ax, By v Cx. Hy cho bit mi bn ghp c bao nhiu mnh mi
mu.
Vi th d nh trong hnh, N = 2, Ax = 2, By = 2, Cx = 3 ta tnh c kt qu nh trong bng.
ngha ca cc trn bn ghp c cho bit bn no trong ln i th my ca mnh, ghp mnh mu g. Th
d, A5:T cho bit bn A, trong ln i th 5 ghp mnh mu trng. xut pht ca mi bn k hiu l 0.
O O O O O O
C
A1:X A2:X A3:T A4:T C3:D C2:D Xanh Trng
C
A0:X A1:X A2:T A3:T C2:D C1:D A 5 4 0
A
C
B
C tam ti 4 6
N = 2
116
C
A1:X B1:X B2:T C2:T C1:D C0:D B 3 3 0
C
B1:X B0:X B1:T B2:T C2:D C1:D C 0 1 8
C tam ti, N = 2, A(2,1), B(4,2), C(3,6)
X: Xanh, T: Trng, D: .
Kt qu
Thut ton
Bi ny kh d gii. Nu bn kho t chc d liu th chng trnh s rt gn. Trc ht ta cn xc
nh rng mi (i,j) trn bn c s do bn no ghp: A, B hay C ? Ta nh ngha khong cch gia hai
(i,j) v (x,y) trn bn c l s t nht nm trn ng i t ny n kia qua cc k cnh nhau.
Khong cch ny chnh l tng chiu di hai cnh k nhau ca hnh ch nht nhn hai cho lm hai
nh i din, do c tnh theo cng thc
d = abs(i-x) + abs(j-y) +1
Gi tr d c ngha g ? Nu ta qui nh nh s cc ln i cho mi u th l 0, 1, 2, th d-1 cho
bit ln i th my ca mi bn. V trt t tnh ln i ca cc bn l A B C nn ta cn xc nh gi tr
min trong ba khng cch d
A
, d
B
v d
C
. Tuy nhin chng ta s khn ngoan mt cht, c th l ta s tnh d
theo cng thc ht 1
d = abs(i-x) + abs(j-y)
v vit hm min3 nhn vo l ba gi tr d
A
, d
B
v d
C
v cho ra l tn ca ngi c ghp mnh ti
ang xt.
function Min3(a,b,c: integer): char;
var k: char;
begin
k := 'A';
if a > b then begin k := 'B'; a := b end;
if a > c then k := 'C';
Min3 := k;
end;
Sau khi xc nh c ch ca mnh ghp ti (i,j) ta d dng tnh c mu ca mnh ghp ti
. V l c c ba mu v ta tm qui c cc gii mu tnh t tri qua phi l 0, 1 v 2 nn mu cn chn
t ti (i,j) khi s l (j-1) div N.
Ta khai bo mng kq dng tch ly kt qu nh sau:
kq: array['A'..'C',0..2] of integer;
Khi c[v,i] s cho bit bn v ghp bao nhiu qun mu i, v = 'A', 'B', 'C'; i = 0 (mu Xanh), 1
(mu Trng), 2 (mu ).
Cc bin chung ca chng trnh s l:
var
n: integer; { Ban co co kich thuoc 2n3n }
Ax,Ay,Bx,By,Cx,Cy: integer; { Toa do xuat phat cua A, B, C }
kq: array['A'..'C',0..2] of integer; { Chua ket qua }
Th tc XuLi s duyt ln lt mi (i , j) trn bn c, xc nh ch nhn ca ny v s mu ca
mnh cn ghp tch ly cho ch nhn .
procedure XuLi;
var i,j: integer;
begin
fillchar(kq,sizeof(kq),0);
for I := 1 to 2*N do
for j := 1 to 3*N do
inc(c[Min3(abs(i-Ax)+abs(j-Ay),abs(i-Bx)+abs(j-By),
117
abs(i-Cx)+abs(j-Cy)),(j-1) div N]);
end;
Chng trnh C#
Chng trnh C# di y thc hin vi d liu cho trc N = 2, A(2,1), B(4,2), C(3,6).
// C#
using System;
using System.Collections.Generic;
using System.Text;
namespace SangTao2 {
class CoTamTai {
static int n = 2; // Ban co kich thuoc 2N3N
static int [,] kq = new int [3,3];
static int Ax = 2, Ay = 1, Bx = 2*n, By = 2,
Cx = 3, Cy = 3*n; // Toa do xuat phat
static void Main(string[] args) {
XuLi();
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j)
Console.Write(KQ[i, j] + " ");
Console.WriteLine();
}
Console.ReadLine();
}
static int Min3(int a, int b, int c) {
int min = 0;
if (a > b) { min = 1; a = b; }
if (a > c) min = 2;
return min;
}
static void XuLi() {
Array.Clear(Kq,0,Kq.Length);
int n2 = 2 * n;
int n3 = 3 * n;
for (int i = 1; i <= n2; ++i)
for (int j = 1; j <= n3; ++j)
++KQ[Min3(Math.Abs(i-Ax)+Math.Abs(j-Ay),
Math.Abs(i-Bx)+Math.Abs(j-By),
Math.Abs(i-Cx)+Math.Abs(j-Cy)),(j-1)/n];
}
} // Co Tam Tai
} // SangTao2
phc tp
Ta phi duyt mi trn bn c vy phc tp tnh ton c N
2
.
Bi sau y tng t nh bi trn nhng kh hn v cc th tc m ha.
4.2 Li tam gic u
Cho tam gic u ABC, nh A, cnh di N n v. Ti cc im chia nguyn trn cc cnh ta k cc
ng thng song song chia tam gic thnh N
2
tam gic n v (TGV). M s cho cc TGV theo trt t
t trn xung v t tri qua phi l 1, 2, , N
2
. Ba bn A, B v C c cp mi bn mt TGV khc nhau
lm ni xut pht trn cc cnh AB cho bn A, BC cho bn B v AC cho bn C. Ln lt theo th t quay
118
vng A, B, C vit ch ci tn mnh vo cc TGV k cnh vi cc tam gic m mnh vit ln
trc. Bit cc gi tr N, v cc im xut pht NA, NB v NC, tnh s ch ci mi loi mi bn vit.
T chc d liu
Cc bin dng chung:
var n: longint; { Do dai canh tam giac }
f,g: text; { input, output file }
AN, BN, CN: longint; { O xuat phat }
Ad, Av, Bd, Bv, Cd, Cv: longint; { Toa do xuat phat }
Ak,Bk,Ck: longint;
A,B,C: longint; { con dem }
Kq: array [A..C] of longint;
trong n l chiu di mt cnh ca tam gic u; AN, BN v CN l s hiu ca cc xut pht
tng ng cho A, B v C.
Thut ton
Xt cc tam gic n v t nh xung n cnh y ca bn c. Ta thy, trn dng 1 c 1 TGV,
dng 2 c 3, dng 3 c 5 TGV... Tng qut, trn dng i tnh t nh xung n y s c 2*i -1 TGV.
Trn mi dng i ta gn s hiu cho cc TGV l 1, 2, ... , 2i-1. Ta nh ngha ta ca mt tam gic
n v c s hiu (tuyt i theo u bi) cell l cp s (d,v) trong d l s hiu dng cha TGV v v
l s hiu ca tam gic trn dng d. Th tc ToaDo di y tnh ta cho mt TGV theo cell - s
hiu (tuyt i) ca TGV nh cch m s ca bi. Th tc cho ra hai gi tr, dong - dng cha TGV
cell v viTri - s hiu ca TGV trn dng m ta gi l s hiu tng i. Th d, ToaDo(15,d,v)
cho ta d = 4, v = 6.
C9
1
3
A2
4
8
7
6
5
10
11
13
12
B14
15
16
Li Tam gic N = 4, NA = 2, NB = 14,
NC = 9.
Kt qu, A: 9, B: 5, C: 2.
119
procedure ToaDo(cell: longint;var dong, viTri:longint);
begin
dong := 0;
while cell > 0 do
begin
dong := dong + 1;
cell := cell - (2*dong-1);
end;
viTri := cell + (2*dong-1);
end;
Hm KhoangCach di y tnh khong cch gia hai TGV theo ta (d1,v1) v (d2,v2),
trong d1, d2 l s hiu dng, v1 v v2 l s hiu tng i ca chng (trn dng). Ging nh bi trc,
khong cch trong bi ny chnh l s TGV t nht, k cnh nhau trn ng i t TGV (d1,v1) n
TGV (d2,v2). Trc ht ta i ch hai ta , nu cn, sao cho tam gic th nht lun lun nm dng
trn so vi tam gic th hai, tc l d1 s d2. Sau ta nhn xt nh sau:
Nu mt TGV c nh quay ln trn th
* S hiu tng i ca n l s l, v
* N s l nh ca mt tam gic u cha n v c cc cnh song song vi cc cnh ca bn c.
Nu mt TGV c nh quay xung di th
* S hiu tng i ca n l s chn, v
* TGV k cnh vi n trn cng dng s c nh quay ln trn.
Ta gi cc TGV c nh quay ln trn l tam gic l phn bit vi cc TGV chn - c nh
quay xung di.
Nu TGV th nht (d1,v1) l tam gic l ta xt tam gic ln hn to bi cc TGV nhn tam gic
l ny lm nh v c cnh y trn dng d2. Ta tnh hai nh trn y ca tam gic ny trn dng d2 l C1
v C2 theo cng thc
d := 2*(d2 - d1);
c1 := v1;
c2 := v1 + d;
Tip n ta xt v tr v2 trn cnh y c th nm gia C1 v C2 hoc nm ngoi oan [C1, C2]
ng thi xt v2 l tam gic chn hay l.
function KCLe(d1,v1,d2,v2: longint):longint;
var c1,c2,d: longint;
begin
{ v1 <= v2 }
d := 2*(d2 - d1);
c1 := v1;
c2 := v1 + d;
if (c1 <= v2) and (v2 <= c2) then
begin
if odd(v2) then KCLe := d
else KCLe := d - 1;
exit;
end;
KCLe := d + Min(abs(v2-c1),abs(v2-c2));
end;
Nu TGV th nht (d1,v1) l tam gic chn th ta li li mt dng d xt TGV l c chung y
vi TGDV th nht ri tnh ton nh trn v gim kt qu 1 n v.
function KhoangCach(d1,v1,d2,v2: longint):longint;
var t: longint;
begin
if d1 > d2 then
begin
120
t := v1; v1 := v2; v2 := t;
t := d1; d1 := d2; d2 := t;
end;
{ v1 <= v2 }
if odd(v1) then KhoangCach := KCLe(d1,v1,d2,v2)
else KhoangCach := KCLe(d1-1,v1-1,d2,v2) - 1;
end;
procedure XuLi;
var d,v,j: longint;
Ad, Av, Bd, Bv, Cd, Cv: longint;
begin
fillchar(kq,sizeof(kq),0);
ToaDo(NA, Ad, Av);
ToaDo(NB, Bd, Bv);
ToaDo(NC, Cd, Cv);
for d := 1 to N do
for v := 1 to 2*d - 1 do
inc(kq[Min3(KhoangCach(Ad,Av,d,v),
KhoangCach(Bd,Bv,d,v),
KhoangCach(Cd,Cv,d,v))]);
end;
Chng trnh C#
Chng trnh C# di y gii bi ton vi d liu cho trc N = 4, A, B v C ln lt xut pht ti
cc TGV 2, 14 v 9 nh th d cho.
// C#
using System;
using System.Collections.Generic;
using System.Text;
namespace SangTao2 {
class TamGiacDeu {
static int n = 4, NA = 2, NB = 14, NC = 9;
static int[] Kq = new int[3];
static void Main(string[] args){
XuLi();
for (int i = 0; i < 3; ++i)
Console.Write(KQ[i] + " ");
Console.ReadLine();
}
// Tinh dong va vi tri tren dong
// theo so hieu cua TGDV
static void ToaDo(int cell, out int dong, out int viTri){
dong = 0;
while (cell > 0){
++dong; cell -= (2*dong - 1);
}
viTri = cell + (2*dong - 1);
}
static int KhoangCach(int d1, int v1, int d2, int v2){
if (d1 > d2){
int t;
t = d1; d1 = d2; d2 = t;
t = v1; v1 = v2; v2 = t;
}
return (v1%2==1)?KCLe(d1,v1,d2,v2):KCLe(d1-1,v1-1,d2,v2)-1;
121
}
static int KCLe(int d1, int v1, int d2, int v2){
int c1=v1, d=2*(d2-d1), c2=v1+d;
// Xet tam giac voi 3 dinh v1 c1 c2
if (c1 <= v2 && v2 <= c2)
return (v2 % 2 == 1) ? d : d-1;
return d + Math.Min(Math.Abs(v2-c1),Math.Abs(v2-c2));
}
static int Min3(int a, int b, int c){
int min = 0;
if (a > b) { min = 1; a = b;}
if (a > c) min = 2;
return min;
}
static void XuLi(){
int Ad, Av, Bd, Bv, Cd, Cv;
ToaDo(NA,out Ad, out Av);
ToaDo(NB,out Bd, out Bv);
ToaDo(NC,out Cd, out Cv);
Array.Clear(Kq, 0, Kq.Length);
for (int d = 1; d <= n; ++d){
int vv = 2*d-1;
for (int v = 1; v <= vv; ++v)
++KQ[Min3(KhoangCach(Ad,Av,d,v),
KhoangCach(Bd,Bv,d,v),
KhoangCach(Cd,Cv,d,v))];
}
}
} // Tam Giac Deu
} // SangTao2
phc tp
Ta phi duyt mi TGV trn bn c, vy phc tp tnh ton c N
2
.
4.3 Dng biu din ca giai tha
Cho s t nhin n s 480.000. Hy phn tch n! ra tch ca cc tha s nguyn t theo trt t tng
dn. Th d, 13! = 2
10
.3
5
.5
2
.7.11.13. Kt qu hin th di dng cc dng, mi dng mt s nguyn t tip
n l s m tng ng. Cc s trn cng dng cch nhau qua du cch. Th d trn cho ta kt qu hin th
nh sau
2 10
3 5
5 2
7 1
11 1
13 1
Thut ton
Nhn xt Cho s t nhin N v mt s nguyn t p. Khi ,
Nu vit dy tha s 1, 2, ..., N vo mt bng c p ct th ta thy c n
1
= N div p dng cha p,
2p,...,n
1
.p ( ct cui cng). Nhm cc phn t ny li ta c,
1p.2p....n
1
p = (1.2...n
1
).p
n1
. Thc hin tng t vi tch 1.2...n
1
ta thu c n
2
= n
1
div p dng cha
p, 2p,...,n
2
.p... T y ta suy ra ly tha k ca p, p
k
trong dng phn tch ca N! s l k = n
1
+n
2
+...+n
v
, trong
122
n
i
= n
i-1
div p, n
1
= N div p, n
v
= 0, i = 2..v. Hm tnh ly tha ca p trong dng phn tch ca N! bng
cc php chia lin tip khi s nh sau,
function Power(n,p: longint): byte;
var k: byte;
begin
k := 0;
while (n <> 0) do
begin
n := n div p;
k := k + n;
end;
Power := k;
end;
Ta dng hm NextPrime sinh ln lt cc s nguyn t p trong khong 2..N v tnh
Power(N,p). Nu gi tr ny ln hn 0 th ta hin th kt qu.
procedure Fac(n: longint);
const bl = #32; { Dau cach }
var p: longint; k: byte;
begin
writeln;
p := 2;
while p <= n do
begin
k := Power(n,p);
if (k > 0) then writeln(p,bl,k);
p := NextPrime(p);
end;
end;
Hai hm ph tr.
Hm IsPrime(p) kim tra p c phi l s nguyn t hay khng bng cch xt xem trong khong
t 2 n p c c no khng.
function IsPrime(p: longint): Boolean;
var i: longint;
begin
IsPrime := false;
if p < 2 then exit;
for i := 2 to round(sqrt(p)) do
if p mod i = 0 then exit;
IsPrime := True;
end;
Hm NextPrime(p) sinh s nguyn t st sau p bng cch duyt tun t cc s l sau p l p+2k
nu p l v (p-1) + 2k, nu p chn.
function NextPrime(p: longint): longint;
begin
if p < 2 then
begin
NextPrime := 2;
exit;
end;
if not odd(p) then p := p-1;
repeat
p := p+2;
until IsPrime(p);
123
NextPrime := p;
end;
Ta c th ci tin kh mnh tc tnh ton bng cc k thut sau.
Sinh sn cc s nguyn t trong khong t 1..N bng gii thut Sng mang tn nh ton hc Hi Lp
Eratosthene. T vi nghn nm trc, Eratosthenes dy nh sau:
Ba ging ca Eratosthenes
Nu tr mun lit k ton b cc s nguyn t
nm trong khong t 1 n N hy lm nh sau
1. Vit dy s t 1 n N.
2. Xa i s 1 v n khng phi l s nguyn t, cng
khng phi l hp s. N l mt s c bit.
3. Ln lt duyt t 2 n N nh sau. Nu gp s
cha b xa th chnh l mt s nguyn t. Tr hy
xa mi bi ca s ny k t bnh phng ca n tr i.
Khi kt thc, nhng s no khng b xa trn tm
bng s l cc s nguyn t. l kho cc s nguyn t
trong khong 1..N.
Thi cha c giy vit nn thy tr phi vit trn nhng tm bng bng t st vo lc t cn
do, cc s b xa c c thng. Sau khi phi kh ta thu c nhng tm bng thng l ch nh mt ci
sng go.
Vi mng a[0..MN] of byte ln, th d, MN = 60.000 ta c th ghi nhn cc s nguyn t
nm trong khong 1..MN. Ta qui c a[i] = 0 th i l s nguyn t, a[i] = 1 ng vi s i b di thng nn i
khng phi l s nguyn t.
procedure Eratosthenes(n: longint);
var i,j: longint;
begin
fillchar(a,sizeof(a),0);
for i := 2 to round(sqrt(n)) do
if a[i]=0 then
for j := i to (n div i) do a[i*j] := 1;
end;
Th tc phn tch N! ra tha s nguyn t dng ci tin s nh sau,
procedure NewFac(n: longint);
const bl = #32; { Dau cach }
var i,p: longint;
begin
Eratosthenes(n);
writeln;
for i := 2 to n do
if a[i] = 0 then
begin
p := Power(n,i);
if P > 0 then writeln(i,bl,p);
end;
Sau ng c giao ph trch th
vin Alexandria, mt trung tm lu tr
v bo tn cc tc phm vn ha v khoa
hc ni ting ng thi. Ngoi cc
cng trnh tan hc, Eratosthenes cn c
nhng ng gp rt gi tr v o lng.
ng tin hnh o kch thc Tri t.
Eratosthenes (276-194 tr.
CN) Nh ton hc li lc Hy
Lp C i. ng sinh ti
Cyrene, theo hc trng phi
Plato ti Athens. Hong
Ptolemy II mi ng n
Alexandria dy cho hong
t.
124
end;
Dng k thut nh du bit c th to kho s nguyn t c 8.MN v mt byte c 8 bit, mi bit s
qun l 1 s.
Mng a vn c khai bo nh trc: a[0..MN] of byte (quan trng l ch s phi tnh t 0
tr i) nhng lc ny mi phn t a[i] s qun l 8 s ch khng phi mt s nh trc. Tip n bn cn
vit thm ba th tc sau y:
Th tc BitOn(i) - t tr 1 cho bit th i trong dy bit a (bt bit). Cc bit trong dy a s c m
s t 0 n 8MN-1= 480.000-1. Bn thn s 480.000 l hp s nn ta c th b qua.
procedure BitOn(i: longint);
var b,p: longint;
begin
b := i shr 3; { i div 8 }
p := i and 7; { i mod 8 }
a[b] := a[b] or (1 shl p);
end;
t tr 1 cho bit i trong dy bit a
1. Xc nh xem bit i nm trong byte no
b := i div 8
2. Xc nh xem bit i l bit th my trong byte b
(tnh theo trt t 7,6,5,4,3,2,1,0)
p := i mod 8
3. Ly s nh phn 8 bit 00000001 dch tri p v
tr ri cng logic theo bit vi a[b].
a[b] := a[b] or (1 shl p);
Bn ghi nh s tng ng ca cc php ton sau y
Php
ton
Php ton tng ng
x div
2
k
x shr k
x mod
2
k
x and 2
k
-1
Tnh theo dng ny s nhanh
hn
Th tc BitOff(i) t tr 0 cho bit th i trong dy bit a (tt bit).
procedure BitOff(i: longint);
var b,p: longint;
begin
b := i shr 3; { i div 8 }
p := i and 7; { i mod 8 }
a[b]:=a[b] and (not(1 shl p));
end;
t tr 0 cho bit i trong dy bit a
1. Xc nh xem bit i nm trong byte no
b := i div 8;
2. Xc nh xem bit i l bit th my trong byte b
(tnh theo trt t 7,6,5,4,3,2,1,0)
p := i mod 8;
3. Ly s nh phn 6 bit 00000001 dch tri p v
tr, lt ri nhn logic theo bit vi a[b].
a[b]:=a[b] and (not(1 shl p));
Hm GetBit(i) cho ra tr (1/0) ca bit i trong dy bit a.
function GetBit(i: longint): byte;
var b,p: longint;
t tr 0 cho bit i trong dy bit a
1. Xc nh xem bit i nm trong byte no
125
begin
b := i shr 3;
p := i and 7; { i mod 8 }
GetBit := (a[b] shr p) and 1;
end;
b := i div 8;
2. Xc nh xem bit i l bit th my trong byte b
(tnh theo trt t 7,6,5,4,3,2,1,0)
p := i mod 8;
3. Dch a[b] qua phi p v tr, ri nhn logic
theo bit vi 00000001 ly bit phi nht (bit 0).
GetBit := (a[b] shr p) and 1;
Cc th tc c bn theo k thut x l bit khi s nh sau.
procedure Eratosthenes_B(n: longint);
var i,j: longint;
begin
fillchar(a,sizeof(a),0);
for i:=2 to round(sqrt(n)) do
for j:=i to (n div i) do
BitOn(i*j);
end;
procedure BFac(n: longint);
const bl = #32; { Dau cach }
var i,p: longint;
begin
Eratosthenes_B(n);
writeln;
for i:=2 to n do
if GetBit(i)=0 then
begin
p := Power(n,i);
if P > 0 then writeln(i,bl,p);
end;
end;
Chng trnh C#
// C#
using System;
using System.Collections.Generic;
using System.Text;
namespace SangTao2 {
class GiaiThua {
static byte [] a = new byte[40000];
static void Main(string[] args){
BFac(13);
Console.ReadLine();
}
static int Power(int n, int p){
int k = 0;
while (n != 0){ n /= p; k += n; }
return k;
}
static void Fac(int n) {
Console.WriteLine();
int p = 2, k;
while (p <= n){
k = Power(n,p);
126
if (k > 0) Console.WriteLine(p+" "+k);
p = NextPrime(p);
}
}
static bool IsPrime(int p){
if (p<2) return false;
if (p==2) return true;
if (p % 2 == 0) return false;
int cp = (int)(Math.Sqrt(p));
for (int i=3; i <= cp; i+=2)
if (p % i == 0) return false;
return true;
}
static int NextPrime(int p){
if (p < 2) return 2;
if (p % 2 == 0) --p;
do { p += 2; } while (!IsPrime(p));
return p;
}
// Sang Eratosthene dung byte
static void Eratosthenes(int n){
Array.Clear(a,0,a.Length);
int sn = (int)Math.Sqrt(n);
for (int i = 2; i <= sn; ++i)
if (a[i]==0){
int ni = n/i;
for (int j = i; j <= ni; ++j) a[i*j] = 1;
}
}
// Gan 1 cho bit i
static void BitOn(int i){
int b = i >> 3;
int p = i & 7;
a[b] |= (byte)(1 << p);
}
// Gan 0 cho bit i
static void BitOff(int i){
int b = i >> 3;
int p = i & 7;
a[b] &= (byte)~(1 << p);
}
// Lay tri cua bit i
static byte GetBit(int i) {
int b = i >> 3;
int p = (i & 7);
return (byte)((a[b] >> p)&1);
}
// Sang Eratosthene dung bit
static void Eratosthenes_B(int n){
Array.Clear(a, 0, a.Length);
int sn = (int)Math.Sqrt(n);
for (int i = 2; i <= sn; ++i)
if (GetBit(i) == 0) {
int ni = n / i;
for (int j = i; j <= ni; ++j) BitOn(i * j);
}
}
127
static void BFac(int n){
int p;
Eratosthenes_B(n);
for (int i = 2; i <= n; ++i)
if (GetBit(i)==0)
{
p = Power(n,i);
if (p > 0) Console.WriteLine(i+" "+p);
}
}
} // GiaiThua
} // SangTao2
phc tp
lit k cc s nguyn t t 1..N ta duyt t 1 n N , vi mi s nguyn t ta phi gch ti a
c N cc bi ca chng. Vy phc tp tnh ton c N. N .
4.4 Xp si
Cho mt bng chia li vung N dng m s 1..N tnh t trn xung v M ct m s 1..M tnh t
tri sang. Mi c php t khng qu 1 vin si. Ngi ta cho trc gii hn tng s si c php
t trn dng i l d
i
, i = 1..N v trn mi ct j l C
j
, j = 1..M. Hy tm mt phng n xp c nhiu si
nht trong bng, bit rng cc d liu u hp l v bi ton lun c nghim.
Thut ton
T chc d liu:
const MN = 101;
d: array[0..MN] of integer;
c: array[0..MN] of integer;
a: array[1..MN,1..MN] of byte;
trong d l mng cha gii hn si trn dng, c - trn ct, a l mng hai chiu biu din bng chia
li vung, a[i,j] = 1 - c vin si t ti dng i, ct j; a[i,j] = 0 - khng c si ti ny. Ta thc hin k
thut hai pha nh sau.
procedure XepSoi;
var j: integer;
begin
fillchar(a,sizeof(a),0);
d[0] := M+1; { dat linh canh }
{ Pha 1 } XepDong;
{ Pha 2 } for j := 1 to M do ChinhCot(j);
end;
Pha th nht: Xp ti a si vo mi dng. Mi dng i ta xp lin nhau d[i] vin si. ng thi ta s
dng li cc bin mng d v c vi ngha sau y: d[i] cho bit v tr ct ca vin si cui cng trn dng i.
c[j] cho bit s si cn c th xp thm trn ct j. D nhin, ta phi chnh li cc gi tr c[j] mi khi xp
thm 1 vin si vo ct ny. Nu c[j] < 0 tc l ta cn bt si ct j. Th tc xp dng khi s nh sau.
procedure XepDong;
var i,j: integer;
begin
for i := 1 to N do
for j := 1 to d[i] do
begin
a[i,j] := 1; dec(c[j]);
end;
end;
128
Pha th hai: Sau khi xp xong N dng ta tin hnh chnh tng ct j c gi tr c[j] < 0 n khi no
c[j] = 0. chnh ct j theo phng php tham lam ta duyt chn mt dng imin c cha si ti ct j v
u phi d[imin] t gi tr nh nht. Sau ta chuyn vin si trn dng imin t ct j sang ct d[imin]+1
v chnh li cc gi tr c[j] v d[imin]. tm dng imin ta cn dng phn t d[0] vi gi tr ln nht lm
phn t khi u. Ta c th cho gi tr ny l M+1, v mi dng khng th c qa M vin si. Bn cn lu
rng khi d[imin] = M tc l mi vin si cui cng trn mi dng u chim v tr ti ct M tc l ht ch
t si.
procedure ChinhCot(j: integer);
begin
while c[j] < 0 do GiamCot(j);
end;
procedure GiamCot(j: integer);
var i: integer;
begin
i := DongMin(j);
a[i,j] := 0; { Bo vien soi } inc(c[j]);
if d[i] = M then exit;
inc(d[i]); a[i,d[i]] := 1; { Dat 1 vien vao day }
dec(c[d[i]]);
end;
function DongMin(j: integer): integer;
var i,imin: integer;
begin
imin := 0;
for i:=1 to N do
if a[i,j]=1 then
if d[i] < d[imin] then imin := i;
DongMin := imin;
end;
Th d di y minh ha thut ton vi N = M = 4; d = (3,2,1,2), c = (2,2,2,2).
0 0 0 0 3 1 1 1 0 3
0 0 0 0 2 1 1 0 0 2
0 0 0 0 1 1 0 0 0 1
0 0 0 0 2 1 1 0 0 2
2 2 2 2 -2 -1 1 2
Cu hnh ban u Sau Pha 1
1 1 1 0 3 1 1 1 0 3 1 1 1 0 3
1 1 0 0 2 1 1 0 0 2 0 1 1 0 3
1 0 0 0 1 0 1 0 0 2 0 1 0 0 2
1 1 0 0 2 1 1 0 0 2 1 1 0 0 2
-2 -1 1 2 -1 -2 1 2 0 -2 0 2
Chnh ct 1
129
1 1 1 0 3 1 1 1 0 3 1 1 1 0 3
0 1 1 0 3 0 1 1 0 3 0 1 1 0 3
0 1 0 0 2 0 0 1 0 3 0 0 1 0 3
1 1 0 0 2 1 1 0 0 2 1 0 1 0 3
0 -2 0 2 0 -1 -1 2 0 0 -2 2
Chnh ct 2
1 1 1 0 3 1 1 0 1 4 1 1 0 1 4
0 1 1 0 3 0 1 1 0 3 0 1 0 1 4
0 0 1 0 3 0 0 1 0 3 0 0 1 0 3
1 0 1 0 3 1 0 1 0 3 1 0 1 0 3
0 0 -2 2 0 0 -1 1 0 0 0 0
Chnh ct 3
phc tp
Ta cn chnh M ct. Mi ct ta cn lp ti a N ln, mi ln gim c 1 vin si trong ct.
gim 1 vin si ny ta phi duyt N dng tm imin. Tng cng ta cn c MN
2
thao tc.
Chng trnh C#
// C#
using System;
using System.Collections.Generic;
using System.Text;
namespace SangTao2 {
class XepSoi {
const int n = 4, m = 4;
static byte [,] a = new byte[n+1,m+1];
static int [] d = new int [n+1] {0,3,2,1,2};
static int [] c = new int [m+1] {0,2,1,2,3};
static void Main(string[] args) {
Xep(); Show();
Console.ReadLine();
}
static void Show(){
for (int i = 1; i <= n; ++i){
for (int j = 1; j <= m; ++j)
Console.Write(a[i, j]);
Console.WriteLine();
}
}
static void Xep(){
Array.Clear(a,0,a.Length);
d[0] = m+1;
130
XepDong();
for (int j = 1; j <= m; ++j) ChinhCot(j);
}
static void XepDong(){
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= d[i];++j){
a[i,j] = 1; --c[j];
}
}
static void ChinhCot(int j) {
while (c[j] < 0) GiamCot(j);
}
static void GiamCot(int j){
int i = DongMin(j);
a[i,j] = 0; // Bot 1 vien tai o (i,j)
++c[j];
if (d[i]==m) return; // het cho dat tren dong i
++d[i]; a[i,d[i]] = 1; // Dat 1 vien vao o (i,d[i])
--c[d[i]];
}
static int DongMin(int j){
int imin = 0;
for (int i = 1; i <= n; ++i)
if (a[i,j]==1)
if (d[i] < d[imin]) imin = i;
return imin;
}
} // XepSoi
} // SangTao2
4.5 Dy cc hon v
Dy cc hon v ca N ch ci HOA u tin trong bng ch ting Anh c sp theo trt t t
in tng dn v vit lin nhau thnh mt dy k t duy nht. Hy cho bit k t th M trong dy tnh t 1
tr i, 2 s N s 10, 1 s M s N.N!. Th d, vi N=3, ta c dy 6 hon v xp theo trt t t in l ABC, ACB,
BAC, BCA, CAB, CBA. Sau khi ghp chng ta thu c dy duy nht gm 18 k t
ABCACBBACBCACABCBA. K t th M = 15 trong dy l: B.
Thut ton
Nu ta vit mi hon v trn 1 dng th k t th M s nm trn dng d = (M-1) div N (tnh t dng
0) v s chim v tr v = ((M-1) mod N)+1 (tnh t 1) trn dng d . Nh vy ta cn xc nh hon v trn
dng d ri ly k t nm v tr v lm kt qu.
xc nh hon v (c
1
,c
2
,...,c
N
) ti dng d ta ln lt tnh cc k t c
i
, i = 1..N. Ta phn hoch cc
hon v theo nhm. Nu b k t u tin th ta cn li (N-1)! hon v, khi hon v ti dng d s ri vo
nhm d div (N-1)! v s chim dng d mod (N-1)! trong nhm . Tng t, ta tnh cho cc k t th 2, 3,
..., N-1. K t cn li s chim v tr th N. Nu bit nhm d ca k t th i trong hon v th ta tnh c
chnh k t nh sau.
d = 1 ng vi k t th nht trong s cc k t cha dng,
d = 2 ng vi k t th hai trong s cc k t cha dng,
...
Tng qut, d ng vi k t th d trong s cc k t cha dng.
Mi ln xc nh c k t no th ta nh du k t bng th tc Mark.
trnh vic tnh n! ta vit th tc ThuongDu(z, n, q, r) cho ra thng q v d r ca php chia s t
nhin z cho n!, c th l q = z div n! v r = z mod n!. Th tc ny kh n gin. Ta c
131
q
1
= z div n; r
1
= z mod n z = q
1
.n + r
1
;
q
2
= q
1
div (n-1); r
2
= q
1
mod (n-1) q
1
= q
2
.(n-1) + r
2
;
q
n-1
= q
n-2
div 2; r
n-1
= q
n-2
mod 2 q
n-2
= q
n-1
.2 + r
n-1
.
q
n
= q
n-1
div 1 = q
n-1
; r
n
= q
n-1
mod 1 = 0.
Thay ln lt cc i lng ca dng di vo dng trn ta thu c q = q
n-1
v r = r
1
+ n.r
2
+ (n-
1).r
3
++ 3.r
n-1
+ 2.r
n
. Nhn xt ny cho php ta xy dng th tc theo k thut chia lin tip nh sau.
procedure ThuongDu(z,n: longint;var q,r: longint);
var c: longint;
begin
r := 0; q := z; c := 1;
while n > 1 do
begin
r := r + (q mod n)*c;
q := q div n;
c := n; n := n - 1;
end;
end;
Th tc Test trong chng trnh di y tnh mi xut hin ca cc k t (M = 1..24*4) trong dy
cc hon v vi N = 4.
Chng trnh Pascal
(* Pascal *)
uses crt;
const MN = 20; bl = #32;
var b: array[0..MN] of byte;
{ d = z div n! r = z mod n! }
procedure ThuongDu(z,n: longint;var q,r: longint);
T vit
{ Danh dau ki tu v thu k
trong so cac ki tu chua dung }
procedure Mark(N,k,v: integer);
var i,d: integer;
begin
d := 0;
for i := 1 to N do
if b[i] = 0 then
begin
d := d+1;
if d = k then
begin
b[i] := v;
exit;
end;
end;
end;
{ Xac dinh ki tu thu M trong day cac hoan vi }
function Value(N: integer;M: longint): char;
var i,j,v: integer;
th,du,d: longint;
begin
fillchar(b,sizeof(b),0);
d := (M-1) div N; { Dong chua ki tu M }
132
v := (M-1) mod N + 1; { vi tri cua M tren dong d }
{ xac dinh hoan vi tai dong d }
j := N-1;
for i := 1 to N-1 do
begin
ThuongDu(d,j,th,du);
Mark(N, th+1,i);
j := j-1;
d := du;
end;
Mark(N,1,N);
for i:=1 to N do
if b[i] = v then
begin
Value := chr(ord('A') + i-1);
exit;
end;
end;
procedure Test;
var N: integer;
M: longint;
begin
N := 4; writeln;
for M := 1 to 24*N do
begin
write(Value(N,M));
if M mod N = 0 then
begin
if readkey = #27 then halt else writeln;
end;
end;
end;
BEGIN
Test;
END.
Chng trnh C#
// C#
using System;
using System.Collections.Generic;
using System.Text;
namespace SangTao2 {
class DayHoanVi {
const int MN = 20;
static int [] b = new int [MN+1];
static void Main(string[] args){
Test();
}
// q = z / n!; r = z % n!
static void ThuongDu(long z, int n,
out long q, out long r ){
q = z; r = 0;
int c = 1;
133
while (n > 1){
r += (q % n) * c;
q /= n;
c = n; --n;
}
}
static void Mark(int n, long k, int v){
int d = 0;
for (int i = 1; i <= n; ++i)
if (b[i]==0){
++d;
if (d==k){ b[i] = v; return; }
}
}
static char Value(int n, long m){
Array.Clear(b, 0, b.Length);
long d = (int) (m - 1) / n;
// d - Dong chua ki tu can tim
int v = (int)(m - 1) % n + 1;
// v - vi tri cua ki tu tren dong d
int j = n - 1;
long th, du;
for (int i = 1; i < n; ++i){
ThuongDu(d, j, out th, out du);
Mark(n, th + 1, i);
d = du; --j;
}
Mark(n, 1, n);
for (int i = 1; i <= n; ++i)
if (b[i]==v) return (char)('A'+i-1);
return (char)0;
}
// test voi n=4, m=1..n.n!
static void Test(){
int n = 4;
int m4 = 24 * n;
string s;
for (long m = 1; m <= m4; ++m) {
Console.Write(Value(n, m));
if (m % n == 0){
s = Console.ReadLine();
if (s == "stop") break;
}
}
}
} // DayHoanVi
} // SangTao2
N N! N N!
1
2
3
4
1
2
6
24
1
1
1
2
39916800
479001600
6227020800
87178291200
134
5
6
7
8
9
1
0
120
720
5040
40320
362880
362880
0
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
1307674368000
20922789888000
355687428096000
6402373705728000
121645100408832000
243290200817664000
0
Giai tha ca 20 s nguyn dng u
tin
Vi C# bn c th dng kiu int64 hoc long vi 64 bit (8 byte) biu din s nguyn trong khong
[-9.223.372.036.854.775.808, 9.223.372.036.854.775.807].
phc tp
Thut ton ch i hi N = 20 php chia cc s nguyn c ti a 20 ch s v gi th tc Mark N
ln, mi ln gi phi thc hin php duyt trn dy N phn t. Tng cng l N
2
php ton, tc l c 400
php ton thay v 2432902008176640000 php ton nu ta sinh ln lt N! hon v bng phng php vt
cn vi N = 20.
4.6 B bi
Trn bn t mt b bi gm n-1 qun bi m s 1,2,,n-1, 3 s n s 10000. Trng ti ch nh bn
ly k qun bi. Sau trng ti a ra mt s t nhin s. Bn cn c gng thc hin t nht m thao tc
thuc mt trong hai loi sau y:
- Ly thm mt qun bi t trn bn,
- B bt mt qun bi trn tay,
cui cng t c h thc
t mod n = s mod n (*)
trong t l tng s hiu cc qun bi c trn tay bn sau khi bn hon tt m thao tc nh trn.
D liu vo: file vn bn BAI.INP
Dng u tin: 3 s t nhin n, k v s.
T dng th hai tr i: k s t nhin th hin m s ca cc qun bi cn ly lc u.
D liu ra: Hin th trn mn hnh
Dng u tin: s t nhin m cho bit s thao tc t nht cn thc hin
Tip n l m dng, mi dng l mt thao tc ly thm hoc b bt mt qun bi v. v > 0 cho bit
cn ly thm (t trn bn) qun bi v; v < 0 cho bit cn bt (t trn tay) qun bi v t c h thc
(*).
Th d, vi n = 8, trng ti cho s s = 22 v ch nh bn ly k = 3 qun bi l 2, 3 v 6.
135
Nu bn b qun bi 2 v ly qun bi 5 th tng t = 3 + 6 + 5 = 14. Khi
t mod n = 14 mod 8 = 6 = s mod n = 22 mod 8.
Vy mt li gii cho b d liu ny l
Thc hin 2 thao tc: 2 v +5
BAI.INP MN HNH NGHA
8 3 22
2 3 6
2
-2
5
Cho b bi gm 8 qun. Lc u trng ti ch nh bn ly k = 3 qun bi
m s 2, 3 v 6. Ngoi ra trng ti a ra s s = 22.
Sau bn thc hin 2 thao tc
- b qun bi 2
- ly thm qun bi 5.
Khi tng s hiu cc qun bi c trn tay bn s l:
T = 3 + 6 + 5 = 14
T mod N = 14 mod 8 = 6 = s mod 8 = 22 mod 8.
n = 8; s = 22; Trn tay gi k = 3 qun bi 2, 3, 6.
Li gii: B qun bi 2, ly thm qun bi 5.
t = 3+6+5 = 14,
t mod 8 = 14 mod 8 = 6 = s mod 8 = 22 mod 8.
Thut ton
Ta s chng minh rng vi khng qu 2 thao tc (+) ly thm / () b bt mt qun bi ta c th t
c h thc (*).
Trc ht ta nhc li cc php ton ng d. Vi s nguyn dng n cho trc ta xt tp cc s d
trong php chia mt s t nhin x cho n, x mod n, Z
n
= {0,1,2,,n-1}. Trn Z
n
cc php ton cng v nhn
c thc hin nh bnh thng sau ly kt qu chia d cho n. Php ton ly s i ca s x cho ta nx.
Php tr xy c i thnh php cng x vi s i ca y. Ta c
Cng: (x + y) mod n
2 3 6
5
136
Nhn: x*y mod n
Ly s i ca x: n x
Tr: (x + (ny)) mod n.
Hy tng tng cc s ca Z
n
l 0, 1, , n-1 c b tr trn mt vng trn nh trn mt ng h.
tnh tng x+y ta xut pht t x v di chuyn y bc theo chiu kim ng h (cn gi l di chuyn xui),
mi bc ta chuyn qua mt s. Kt qu s l im dng cui cng. tnh hiu x y ta cng xut pht t
x v di chuyn y bc theo chiu ngc li (di chuyn ngc). rng, trn vng trn gm n s, di
chuyn xui y bc s cho cng kt qu nh di chuyn ngc (ny) bc, v ngc li, di chuyn ngc y
bc s tng ng nh di chuyn xui (ny) bc. iu ny c ngha l mun thm b n v cho i
lng t ta c th bt (nb) n v v ngc li, mun bt b n v t i lng t ta c th thm cho t (nb)
n v. Ta cng rng s hiu ca mi qun bi u nh thua n v mi qun bi hoc l c trn tay
ngi chi, hoc l nm trn bn. V l trn, i khi ngi ta ni tnh ton theo ng d (modulo) chnh l
tnh ton trn vng trn.
Bn cng cn ghi nh tnh cht sau y:
Vi mi s t nhin x, y v n, n > 0 v vi mi php ton s hc u e {+, ,*} ta lun c
(x u y) mod n = ((x mod n) u (y mod n)) mod n
Cng thc trn cho ta quy tc d hiu sau y: Khi tnh tr ca cc biu thc s hc ch cha cc
php ton cng, tr v nhn trong Z
n
ta c th thc hin php ly s d mod n trn cc hng t v cc kt
qu trung gian.
V ly tha nguyn dng tng ng vi php nhn lin tip, ta suy ra h qu sau:
a
k
mod n = (a mod n)
k
mod n
Sau khi bit cc gi tr input l n, k, s v s hiu cc qun bi cn ly ln tay, ta gn tr cho mng
a[1..n1] nh sau: a[i] = 1 cho bit qun bi i c trn tay, ngc li, a[i] = 0 cho bit qun bi i cn nm
trn bn. Vi th d cho, trng ti yu cu ta ly 3 qun bi c s hiu 2, 3 v 6 nn a = (0,1,1,0,0,1,0)
ng vi a[2] = a[3] = a[6] = 1, cc gi tr a[i] cn li u bng 0.
Trc ht ta tnh tng s hiu ca cc qun bi c trong tay lc u v t trong bin t. Sau ta
tnh t := t mod n v s := s mod n. Vi th d cho ta tnh c
t = 2+3+6 = 11, do t mod n = t mod 8 = 3
v s mod 8 = 22 mod 8 = 6
Tc l t = 3 v s = 6.
Gi s t > s, ta t b = t s v xt cc trng hp loi tr nhau sau y:
1. b = 0: H thc (*) tha, ta khng phi lm g. Ta thng bo m = 0, trong m l s thao
tc +/ cn thc hin.
2. Qun bi b c trn tay, tc l a[b] = 1: Ta ch vic b qun bi ny xung, khi tng t s
gim b n v theo mod n.
3. Qun bi (nb) c trn bn, tc l a[nb] = 0: Ta ch vic ly thm qun bi ny. Khi tng
t s c thm (n-b) n v theo mod n, iu ny tng ng vi vic gim tng t i b n v theo mod n.
4. Nu khng xy ra cc trng hp 1, 2 v 3 nh trn, tc l b = 0, a[b] = 0, a[nb] = 1, ta tin
hnh nh sau:
Tm hai qun bi u v v tha cc iu kin sau
Qun bi u c trn tay, a[u] = 1,
Qun bi v c trn bn, a[v] = 0,
u = (k*b) mod n; v = ((k1)*b) mod n, k l mt s t nhin. iu ny c ngha l u ln hn v b n
v theo mod n.
Nu tm c hai qun bi u v v nh trn ta s thc hin hai thao tc: b qun bi u (u) v ly
thm qun bi v (+v). Khi tng t s c gim mt lng b theo mod n. Tht vy,
(u v) mod n = (k*b (k1)*b) mod n = b.
137
Trng hp t < s ta phi thm b = s t n v cho cho t. Vic ny tng ng vi gim t bt (n-b)
n v. t b = n-b ri lp li th tc trn s cho ta kt qu tng ng.
Ta chng minh rng nu gp tnh hung 4 th bao gi cng c th tm c hai qun bi u v v nh
m t. Trn hai ngn nm trc nh ton hc C Hy Lp Diophantus pht biu v chng minh nh l
sau:
nh l Cho phng trnh ax mod n = b mod n, vi cc h s a, b, n l cc s t nhin, n > 0. Gi d
l c chung ln nht ca a v n, d = (a,n). Khi
a) Nu d khng l c ca b th phng trnh v nghim.
b) Nu b = kd th phng trnh c ng d nghim trong tp Z
n
. Cc nghim ny c dng (x +
i(n/d) ) mod n, trong x l mt nghim ty , i = 0,1,2...(d-1).
Phng trnh ax mod n = b mod n c ngi i sau gi l phng trnh Diophantus.
Chng minh
Nu x l nghim ca phng trnh ax mod n = b mod n th ax v b c cng s d theo mod n nn
hiu ca chng s chia ht cho n, ax b = kn, hay ax kn = b. Mt khc, do d = (a,n) nn a v n u chia
ht cho d v do hiu axkn cng chia ht cho d, th tc l b phi chia ht cho d. Gi s b = md tc l
phng trnh c nghim. Gi x l nghim nguyn khng m nh nht ca phng trnh trn, ta d dng
kim tra c rng x+i(n/d), i = 0,1,,(d1) cng l nghim ca phng trnh . Tht vy, ta rng
nu d l c chung ln nht ca a v n th an/d chnh l bi chung nh nht ca chng, ngha l an/d chia
ht cho a v n. Ta c
a(x+i(n/d)) mod n = ((ax mod n) + (i(an)/d) mod n) mod n
= (b mod n + 0) mod n = b mod n.
Ta chng minh xong.
Th d 1. Gii phng trnh sau
6x mod 9 = 21 mod 9
Phng trnh trn tng ng vi phng trnh sau:
6x mod 9 = 3
Ta c d = (6,9) = 3. V 3 l c ca v phi nn phng trnh cho c 3 nghim. D thy x = 2 l
mt nghim ca phng trnh. Vy cc nghim ca phng trnh di dng tng qut l
x + i(n/d) = 2 + i(9/3) = 2 + 3i, i = 0, 1, 2
C th l x
1
= 2, x
2
= 5 v x
3
= 8 l 3 nghim trong tp Z
9
= {0, 1, 2, 3, 4, 5, 6, 7, 8}.
Th d 2. Gii phng trnh
4x mod 12 = 5
Ta c, d = (4,12) = 4 khng phi l c ca 5. Phng trnh v nghim.
Tr li bi ton trn, khi gp tnh hung 4 ta c a[b] = 0 v a[nb] = 1. Xt phng trnh bx mod n
= (nb) mod n. V 1 s b < n nn 1 s nb < n v do (nb) mod n = nb, phng trnh cho c th vit
li l bx mod n = nb.
Theo tnh cht: c chung ln nht ca hai s t nhin (a,b) s khng i nu ta thay s ln nht
trong hai s bng hiu ca n vi s th hai, t d = (b,n), ta c d = (b,nb), tc l nb chia ht cho d,
do phng trnh bx mod n = nb lun c nghim. T nhn xt ny suy ra rng vng lp repeat trong
on trnh di y lun kt thc.
u := b;
repeat
v := u;
u := (u+b) mod n;
until a[u] = 1;
Tht vy, sau k ln lp ta thu c u = kb do phng trnh bx mod n = nb c nghim nn s tn ti
mt gi tr k u = kb mod n = nb. Do a[nb] = 1 nn ti a sau k ln lp th vng lp phi kt thc v ta
s thu c u = kb mod n. V v mang gi tr st trc ca u nn v = (k1)b mod n.
Ta c thut ton sau y
138
1. c d liu vo cc bin n, k v s
2. Khi tr cho mng a[1..n1] vi a[i] = 1 nu qun bi i c trn tay, a[i] = 0 nu qun bi i cn trn
bn.
3. Tnh t = tng s hiu cc qun bi c trn tay.
4. Tnh t := t mod n; s := s mod n.
5. Nu t > s: t b := t s; ngc li t b := n (s t).
ngha: cn gim b n v t tng t t h thc
t mod n = s mod n (*)
6. Xt cc trng hp loi tr nhau sau y
6.1 b = 0: t m = 0; Thng bo: Khng lm g; Stop.
6.2 a[b] = 1 (Qun bi b c trn tay):
Thng bo: Thc hin m = 1 thao tc b: B qun bi b; Stop.
6.3 a[b] = 0 v a[nb] = 0 (Qun bi b khng c trn tay, qun bi (n-b) c trn bn):
Thng bo: Thc hin m = 1 thao tc +(nb): Ly qun bi (nb); Stop.
6.4 a[b] = 0 v a[nb] = 1: (Qun bi b khng c trn tay, qun bi (n-b) khng c trn bn)
6.4.1 Tnh u v v
u := b;
repeat
v := u;
u := (u+b) mod n;
until a[u] = 1;
6.4.2 Thng bo: Thc hin m = 2 thao tc
u: B qun bi u
+v: Ly qun bi v.
6.4.3 Stop
T chng minh trn ta rt ra phc tp ca thut ton l O(n) v trong trng hp xu nht ta
duyt 1 ln mng a cha n-1 phn t.
T chc d liu:
const mn = 10000; { Max n }
bl = #32; { Du cch }
nl = #13#10; { New line: xung dng }
ESC = #27;
fn = 'bai.inp';
type mi1 = array[0..mn] of integer;
var a: mi1; { Dnh du cc qun bi }
n, k : integer; { n1: s lng qun bi }
{ k: s lng cc qun bi trn tay }
t , s: longint; { t: tng s hiu cc qun bi trn tay }
{ s: s i chng ca trng ti }
f: text; { input file }
Th tc c d liu: M input file, c cc gi tr n, k v s, c s hiu v nh du k qun bi c
chn. tnh tng t ca chng }
procedure Doc;
var i,j: integer;
begin
assign(f,fn); reset(f);
read(f,n,k,s);
t := 0; fillchar(a,sizeof(a),0);
for i := 1 to k do
begin
read(f,j); a[j] := 1; t := t+j;
end;
close(f);
139
end;
Th tc x l.
procedure XuLi;
var b,u,v: integer;
begin
t := t mod n; s := s mod n;
if t >= s then b := t-s else b := n-(s-t);
if (b = 0) then
begin
Ket(0,0,0);
exit
end;
if (a[b] = 1) then
begin { Quan bai b co tren tay }
Ket(1,-b,0); { bo xuong }
exit
end;
if (a[n-b] = 0) then
begin { Quan bai n-b co tren ban }
Ket(1,n-b,0); { Lay len }
exit
end;
{ Quan bai b khong co tren tay
Quan bai n-b khong co tren ban }
u := b;
repeat
v := u;
u := (u+b) mod n;
until (a[u] = 1);
Ket(2,-u,v); { bo u, lay v }
end;
Th tc Ket(m,u,v) thng bo kt qu ng vi cc trng hp:
m = 1: B bt hoc ly thm 1 qun bi u;
m = 2: B qun bi u, ly qun bi v.
procedure Ket(m,u,v: integer);
begin
case m of
0: write(nl,'Khong lam gi',nl);
1: begin
write(nl,' Thuc hien 1 thao tac: ');
if (u > 0) then write('+',u,nl)
else write(u,nl);
end;
2: begin
write(nl,' Thuc hien 2 thao tac: ');
if (u > 0) then write('+',u,bl)
else write(u,bl);
if (v > 0) then write('+',v,nl)
else write(v,nl);
end;
end;
end;
phc tp tnh ton: N.
Chng trnh C# di y hin th kt qu trn mn hnh.
140
Chng trnh C#
// C#
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace SangTao2 {
class BoBai {
const string fn = "bai.inp";
const int MN = 20;
static int[] a;
static int n; // so luong quan bai
static int k; // so luong quan bai tren tay
static int s; // so cho truoc trong khoang [1,n];
static int t;
static void Main(string[] args){
Doc(); XuLi();
Console.ReadLine();
}
static void Doc(){
int[] c =
Array.ConvertAll((File.ReadAllText(fn)).Split(
new char[] { '\0', '\n', '\t', '\r', ' ' },
StringSplitOptions.RemoveEmptyEntries),
new Converter<String, int>(int.Parse));
n = c[0]; // so luong quan bai
k = c[1]; // so luong quan bai tren tay
s = c[2]; // so cho truoc
a = new int[n + 1];
Array.Clear(a, 0, a.Length);
t = 0;
for (int i = 3; i < c.Length; ++i){
a[c[i]] = 1; t += c[i];
};
}
static void XuLi(){
t %= n; s %= n;
int b = (t >= s) ? t - s : n - (s - t);
if (b == 0) { Ket(0, 0, 0); return; }
// Sua t: giam b don vi hoac tang n-b don vi
if (a[b] == 1) { // quan b co tren tay
Ket(1, -b, 0); // bo quan b
return;
}
if (a[n - b] == 0) { // quan n-b co tren ban
Ket(1, n - b, 0); // lay quan n-b
return;
}
// Quan b tren ban, quan n-b trn tay
int u = b, v = 0;
do { v = u; u = (u + b) % n; } while(a[u] == 0);
Ket(2, -u, v); // bo quan u, lay quan v
}
static void Ket(int c, int u, int v) {
switch (c){
141
case 0: Console.WriteLine(c); break;
case 1: Console.WriteLine(c + ": " + u); break;
case 2: Console.WriteLine(c + ": "+u+" , "+v);
break;
}
}
} // Bo Bai
} // SangTao2
4.7 Thun th
Dijkstra E.
Cho hon v a = (a
1
,a
2
,...,a
N
) ca N s nguyn dng u tin 1,2,...,N. Mt thun th ca a l dy b
= (b
1
,b
2
,...,b
N
) trong b
i
l s lng cc phn t nh thua a
i
v ng trc a
i
, b
i
= ||{a
j
| a
j
< a
i
, j < i}||.
Bit trc N, 2 s N s 1000.
a) Cho mt hon v a, tnh thun th b ca a.
b) Cho thun th b, tm han v a.
c) Mi thun th u c phn t u tin (tri nht) l 0 nn ta c th b phn t ny. Ngoi ra, nu
trong thun th cn c phn t 0 na ta b thm 1 phn t 0 thu c mt dy c M = N-1 hoc M = N-
2 phn t v gi dy ny l thun th thu gn c. Cho mt thun th thu gn. Hy tm hon v nh nht theo
trt t t in sinh ra thun th thu gn ny.
Th d, vi N = 5,
a) Cho a = (2,5,1,4,3) ta tnh c b = (0,1,0,2,2),
b) Cho b = (0,1,0,2,2) ta tm c a = (2,5,1,4,3),
c) Cho thun th thu gn c = (1,2,2), N = 5, ta tm c a = (2,3,5,4,1).
rng hai hon v (2,5,1,4,3) v (2,3,5,4,1) cng sinh ra thun th thu gn (1,2,2), nhng
hon v (2,3,5,4,1) nh hn.
D liu vo: text file THUANTHE.INP
Dng u tin: N
T dng th hai tr i: N phn t ca hon v a.
Dng tip theo: M
Trn cc dng tip theo: M phn t ca thun th thu gn.
D liu trn cng mt dng cch nhau qua du cch.
D liu ra: Hin th trn mn hnh theo trt t sau:
Cu a: Cho hon v a, tm thun th b.
Cu b: Cho thun th b, tm hon v a.
Cu c: Cho thun th thu gn c tm hon v nh nht a.
Thut ton
Vic xc nh thun th b t hon v a l d dng. Hai cu b v c l hi kh. Chng ta s s dng k
thut i xng trnh by mt thut ton do Dijkstra xut. Theo thut ton ny th th tc cho cu a v
b l i xng nhau. Thut ton tin hnh x l ti ch, ngha l khng s dng mng ph m trc tip bin
i hon v a thnh thun th lu lun trong a v ngc li.
Trc ht ta nhn xt rng vi hon v n v e = (1,2,...,N) th c ng e
i
phn t khng ln hn e
i
v khng ng sau phn t e
i
, i = 1..N. Vy, nu trong mt hon v a m ta thy mt phn t a
j
> a
i
v j s i
th ta khng nh rng ch cn ng a
j
-1 phn t khng ln hn a
j
v khng ng sau phn t a
j
.
Ta khai bo cc bin x, y, a l cc mng cha cc hon v v thun th:
const MN = 1000;
type mi1 = array[0..MN] of integer;
var x,y,a: mi1;
Th tc bin i hon v a sang thun th a khi s nh sau:
142
procedure HoanViThuanThe(var a: mi1;n: integer);
var i,j: integer;
begin
for i := n downto 1 do
for j:=1 to i do
if (a[j] >= a[i]) then dec(a[j]);
end;
thu c hon v a t thun th a ta ch cn vit th tc x l theo chiu ngc li. Hai th tc
nh vy gi l i xng nhau.
procedure ThuanTheHoanVi(var a: mi1;n: integer);
var i,j: integer;
begin
for i := 1 to n do
for j := i downto 1 do
if (a[j] >= a[i]) then inc(a[j]);
end;
Hai th tc ny u c phc tp N
2
.
Cu c c gii nh sau. trc ht thm mt s 0 vo u tri ca d liu vo a. Sau xt hiu N-
M. Nu N-M=1 th chng t thun th thu gn a ch khuyt mt s 0. Ta ch vic gi th tc
ThuanTheHoanVi(a,N) l thu c kt qu. Trng hp N-M=2 th ta phi b thm mt s 0 na vo
mt v tr no trong a. Ta ln lt t s 0 ny vo u phi (v tr N) ri chuyn dn n v u tri, mi
ln mt v tr v gi th tc ThuanTheHoanVi sinh ra mt dy a[1..N] sau kim tra xem dy ny
c phi l hon v ca 1..N hay khng. Nu ng, ta dng thut ton v cho ra kt qu. kim tra mt dy
a[1..N] c phi l mt hon v ca 1..N ta s dng mt mng d[1..N] nh du xem mi phn t a[i] c xut
hin ng 1 ln hay khng. Tuy nhin trc ta phi kim tra iu kin 1 s a[i] s N m bo rng a[i]
nm trong gii hn ca ch s mng d.
procedure ThuanTheThuGon(var a: mi1; n,m: integer);
var b: mi1;
i: integer;
begin
move(a[1],a[2],m*sizeof(integer));
a[1] := 0; inc(m);
if (n = m) then
begin
ThuanTheHoanVi(a,n);
exit;
end;
b := a;
for i := n downto 2 do
begin
{ Them 0 tai vi tri i }
a := b;
move(a[i],a[i+1],(n-i)*sizeof(integer));
a[i] := 0;
ThuanTheHoanVi(a,n);
if LaHoanVi(a,n) then exit;
end;
end;
function LaHoanVi(var a: mi1; n: integer): Boolean;
var d: mi1;
i: integer;
begin
LaHoanVi := false;
fillchar(d,sizeof(d),0);
for i := 1 to n do
143
begin
if (a[i] < 1) or (a[i] > n) then exit;
if (d[a[i]] = 1) then exit;
d[a[i]] := 1;
end;
LaHoanVi := true;
end;
Chng trnh C#
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System;
namespace SangTao2 {
class ThuanThe {
const string fn = "thuanthe.inp";
const int MN = 1001;
static int[] a = new int[MN];
static int[] c = new int[MN];
static int n; // 1..n
static int m; // so luong phan tu trong thuan the thu gon
static void Main(string[] args){
Doc();
Console.WriteLine("\n n = " + n + " m = " + m);
Console.WriteLine("\n Cho Hoan vi: ");
Show(a, n);
HoanViThuanThe(a);
Console.WriteLine("\n Tim Thuan the: ");
Show(a, n);
Console.WriteLine("\n Cho Thuan the: ");
Show(a, n);
ThuanTheHoanVi(a);
Console.WriteLine("\n Tim Hoan vi: ");
Show(a, n);
Console.WriteLine("\n Cho Thuan the Thu gon: ");
Show(c,m);
ThuanTheThuGon(c);
Console.WriteLine("\n Tim Hoan vi: ");
Show(c, n);
Console.ReadLine();
}
static void Doc(){
int[] v =
Array.ConvertAll((File.ReadAllText(fn)).Split(
new char[] { '\0', '\n', '\t', '\r', ' ' },
StringSplitOptions.RemoveEmptyEntries),
new Converter<String, int>(int.Parse));
int i = 0;
n = v[i++];
for (int j = 1; j <= n; ++j) a[j] = v[i++];
m = v[i++];
for (int j = 1; j <= m; ++j) c[j] = v[i++];
}
static void HoanViThuanThe(int[] a){
for (int i = n; i > 0; --i)
144
for (int j = 1; j <= i; ++j)
if (a[j] >= a[i]) --a[j];
}
static void ThuanTheHoanVi(int[] a){
for (int i = 1; i <= n; ++i)
for (int j = i; j > 0; --j)
if (a[j] >= a[i]) ++a[j];
}
static void ThuanTheThuGon(int[] c){
Array.Copy(c, 1, c, 2, m);
c[1] = 0; ++m;
if (m == n) { ThuanTheHoanVi(c); return; }
int [] b = new int [n+1];
Array.Copy(c,1,b,1,m);
for (int i = n; i >= 2 ; --i){
Array.Copy(b,1,c,1,i-1);
Array.Copy(b, i, c, i + 1, m - i + 1);
c[i] = 0;
ThuanTheHoanVi(c);
if (LaHoanVi(c)) return;
}
}
static bool LaHoanVi(int[] c){
int[] d = new int[n + 1];
Array.Clear(d,0,d.Length);
for (int i = 1; i <= n; ++i)
{
if (c[i] < 1 || c[i] > n) return false;
if (d[c[i]] > 0) return false;
d[c[i]] = 1;
}
return true;
}
static void Show(int[] a, int n){
for (int i = 1; i <= n; ++i)
Console.Write(a[i] + " ");
}
} // ThuanThe
} // SangTao2
phc tp
Th tc move(a,b,M) copy m byte t mng a sang mng b. Th tc ThuanTheThuGon c phc
tp N
3
v n gi th tc ThuanTheHoanVi N ln. Hm kim tra mt dy a[1..N] c phi l hon v i hi
N thao tc v s dng mt mng ph d nh du cc phn t xut hin.
4.8 Cc nh khoa hc
Olimpic Quc t
Trong mt hi ngh khoa hc c n nh khoa hc (KH) t chc th gin di hnh thc sau. H t
mt my tnh trong cn phng hp, ngoi my ra ch c th cha thm 1 ngi, mn hnh my tnh hin s
0. Sau mi nh khoa hc buc phi thc hin n thao tc loi 1 v n thao tc loi 2 an xen nhau, trong
thao tc u tin phi l loi 1.
Thao tc loi 1: c Thao tc loi 2: Ghi
145
Vo phng;
c v ghi nh s trn mn hnh;
Ra khi phng.
Vo phng;
Ly s nh trong u cng thm 1 v hin th
kt qu trn mn hnh;
Ra khi phng.
Khi hin th s mi trn mn hnh th s c trn mn hnh t ng b xa v ngi thc hin thao
tc loi 2 cng qun lun s nh.
Cho trc cc gi tr n v m. Hy b tr mt lch thc hin cc nh khoa hc hon thnh trn vn
cuc chi theo ng yu cu v s cui cng hin th trn mn hnh l m.
D liu vo: Tp vn bn KH.INP cha 2 s n v m trn mt dng cch nhau qua du cch.
D liu ra: Tp vn bn KH.OUT cha mt lch thc hin gm mt dy tun t cc dng lnh thuc
mt trong hai dng sau:
Dng th nht gm hai s t nhin ghi cch nhau qua du cch, i t cho bit nh khoa hc i thc
hin thao tc t; i e {1,2,,n}; t e {1,2}.
Dng th hai gm 4 s t nhin ghi cch nhau qua du cch, i t
1
t
2
k cho bit nh khoa hc i thc
hin k ln lin tip cc thao tc t
1
v t
2
an xen nhau; i e {1,2,,n}; t e {1,2}; k > 0.
Nu khng c cch no b tr lch th ghi duy nht mt s 0.
Th d,
KH.INP KH.OUT ngha
3 4
1 1
3 1 2 3
1 2
2 1
1 1 2 2
2 2
2 1 2 2
C 3 nh khoa hc tham gia tr chi th gin vi nhim v sinh ra
kt qu trn mn hnh (MH) l s 4. Lch thc hin s nh sau:
Ngi s 1: c. MH = 0. u(1) = 0.
Ngi s 3: (c; Ghi) 3 ln. MH = 3.
Ngi s 1: Ghi. MH = u(1)+1 = 0+1 = 1.
Ngi s 2: c. u(2) = 1, MH = 1.
Ngi s 1: (c; Ghi) 2 ln. MH = 3.
Ngi s 2 Ghi. MH = u(2)+1 = 1+1 = 2.
Ngi s 2 (c;Ghi) 2 ln. MH = 2+2 = 4.
Ch thch: u(i) - s nh trong u nh khoa hc th i.
Thut ton
Ta s ch ra rng vi mi n > 2 v mi m trong khong 2..n
2
lun lun c mt lch tha yu cu ca
u bi (ta gi l lch hp l) mn hnh (MH) t gi tr m.
Sau khi m tp KH.INP v c hai gi tr n, m ta tin hnh xp lch v ghi dn kt qu vo tp
KH.OUT m sn. Trc ht ta nhn xt rng nu mt ngi thc hin lin tip k ln mt cp thao tc (c
- Ghi, vit tt l G), tc l sau 2k dng lnh
i 1
i 2
...
i 1
i 2
th gi tr ca MH c tng thm k n v. Dy 2k lnh trn c th vit gp li thnh mt lnh 4
thnh phn l i 1 2 k.
146
Ta tnh k = m div n v r = m mod n, ta c m = k.n+r , 0 s r < n, vi ngha l t c gi tr m
trn MH th phi c k ngi thc hin y v lin tip n cp thao tc G, ngoi ra phi c t nht mt
ngi thc hin thm r cp thao tc G. Do yu cu mi ngi buc phi thc hin n thao tc v n thao
tc G, mt l t nhin, ta phi s dng 2 ngi ghi nhn gi tr hin c trn MH khi cn s tr li gi tr
(d nhin l phi cng thm 1) nhm m bo cho cc thao tc cn thit c thc hin lin tc. Xt 3
trng hp sau y.
Trng hp 1: r = 0, tc l m = k.n. Ta cn k ngi thc hin lin tip n cp thao tc G. Tuy
nhin, do nhng ngi khc cng phi thc hin y n cp thao tc G cho mi ngi, nn ta chia cc
thao tc thnh hai loi l cc thao tc v ch l nhng thao tc n mt thi im no s c mt thao tc
khc t li gi tr cho MH. Cc thao tc cn li c gi l thao tc c ch. Nh vy trng hp ny cn
c k ngi thc hin tng cng m = k.n cp thao tc c ch v mi thao tc cn li l v ch. Lch khi s
nh sau.
1 1 - Ngi s 1 c v nh s 0 trn mn hnh. u(1) = 0.
i 1 2 n ; i = k+1..n - Nhng ngi cn li (mang m s k+1..n) G n ln v ch.
1 2 - Ngi s 1 ghi s 1 ln mn hnh (c ch), MH = u(1)+1 = 0 + 1 = 1.
1 1 2 n-1 - Ngi s 1 G nt n-1 ln c ch, MH = n.
i 1 2 n ; i = 2..k - Nhng ngi s 2..k G n ln c ch, MH = n+(k-1).n = k.n = m.
Trng hp 2: r = 0 v k > 0. Ta c m = k.n+r, 0 < r < n, k > 0. Trng hp ny cn n-1 ngi thc
hin cc thao tc v ch, 1 ngi thc hin r cp thao tc G c ch v cng chnh ngi phi thc hin
(n-r) cp thao tc v ch. Ta s dng 2 ngi , s 1 v s 2 nh sau.
1 1 - Ngi s 1 c v nh s 0. u(1) = 0.
i 1 2 n ; i = k+2..n - Nhng ngi m s t k+2 n n G n ln v ch.
1 2 - Ngi s 1 Ghi 1 ln MH. MH = u(1)+1 = 0 + 1 = 1.
2 1 - Ngi s 2 c v nh s 1. u(2) = 1.
1 1 2 n-r - Ngi s 1 G n-r ln v ch.
Tip n l nhng thao tc c ch:
2 2 - Ngi s 2 Ghi s 2 ln MH, MH = u(2)+1 = 1 + 1 = 2.
1 1 2 r-1 - Ngi s 1 G nt r-1 ln c ch, MH = 2+(r-1).
2 1 2 n-1 - Ngi s 2 G nt n-1 ln c ch, MH = 2+(r-1)+(n-1) = n+r.
i 1 2 n ; i = 3..k+1 - Nhng ngi s 3..k+1 G n ln c ch, MH = n+r+(k-1).n = k.n+r.
Trng hp 3: r = 0 v k = 0, do m = r > 2. Trng hp ny cn n-1 ngi thc hin cc thao tc
v ch, 1 ngi thc hin r cp thao tc G c ch v cng chnh ngi phi thc hin (n-r) cp thao tc
v ch. Ta s dng 2 ngi , s 1 v s 2 nh sau.
1 1 - Ngi s 1 c v nh s 0 trn MH. u(1) = 0.
i 1 2 n ; i = 3..n - Nhng ngi t s 3 n n G n ln v ch.
2 1 2 n-1 - Ngi s 2 G n-1 ln v ch.
1 2 - Ngi s 1 Ghi s 1 ln MH. MH = u(1)+1 = 0+1 = 1.
2 1 - Ngi s 2 c s 1 trn MH. u(2) = 1.
1 1 2 n-r+1 - Ngi s 1 G n-r+1 ln v ch.
2 2 - Ngi s 2 Ghi s 2 ln MH. MH = u(2)+1 = 1+1 = 2.
1 1 2 r-2 - Ngi s 1 G r-2 ln c ch, MH = 2 + (r-2) = r.
Phn di y trnh by cu trc d liu v cc th tc c v xp lch. Hai th tc ph tr Lenh2
v Lenh4 dng ghi mt lnh 2 tham bin dng i t v lnh 4 tham bin dng i t
1
t
2
k vo output file g
KH.OUT. Trong cc ch thch di y d[i] l s trong u nh KH th i, t[i] l s thao tc G nh KH i
thc hin, MH mn hnh, k hiu MH = x cho bit ta khng quan tm n gi tr ca MH v sm mun
gi tr ny s b xa.
uses crt;
const
147
fn = 'kh.inp'; gn = 'kh.out';
bl = #32; nl = #13#10; mn = 100;
{ bl du cch; nl xung dng }
type
mi1 = array[0..mn+1] of integer;
var
f,g: text;
n, m, mh: integer;
d,t: mi1;
{ mh Mn hnh }
d[i] - so nho trong dau,
t[i] - con dem lenh cua nguoi i }
procedure Doc;
begin
assign(f,fn); reset(f);
read(f,n,m); close(f);
end;
procedure Lenh2(i,tt: integer);
begin writeln(g,i,bl,tt); end;
procedure Lenh4(i,tt1,tt2,k: integer);
begin if k > 0 then writeln(g,i,bl,tt1,bl,tt2,bl,k); end;
procedure XepLich;
var k,r,i: integer;
begin
assign(g,gn); rewrite(g);
if (n < 2) or (m < 2) or (m > n*n) then
begin writeln(g,0); close(g); exit; end;
k := m div n; { k nguoi co ich }
r := m mod n; { va r thao tac co ich }
if (r = 0) then
begin
Lenh2(1,1); {MH=0,d[1]=0,t[1]=1}
for i := k+1 to n do Lenh4(i,1,2,n);
{MH=x,t[i]=2n,i=k+1..n}
Lenh2(1,2); {MH=1}
Lenh4(1,1,2,n-1); {MH=n,t[1]=2n}
for i := 2 to k do Lenh4(i,1,2,n);
{ MH =n+(k-1)n=kn=m,t[i]=2n,i=2..k}
close(g); exit;
end;
{ r > 0 }
if k > 0 then
begin { r,k > 0 }
Lenh2(1,1); {MH=0,d[1]=0,t[1]=1}
{ Bo nhung nguoi vo ich }
for i:=k+2 to n do Lenh4(i,1,2,n);
{MH=x,t[i]=2n,i=k+2..n}
Lenh2(1,2); {1 Ghi;MH=1,t[1]=2}
Lenh2(2,1); {2 Doc;MH=1;d[2]=1,t[2]=1}
{ Cac thao tac vo ich cua 1 }
Lenh4(1,1,2,n-r); {MH=x,t[1]=2+2(n-r)=2(n-r+1)}
{ Tu day la cac thao tac co ich }
Lenh2(2,2); {MH=2,t[2]=2}
Lenh4(1,1,2,r-1);
{MH=2+r-1,t[1]=2(n-r+1)+2(r-1)=2n}
Lenh4(2,1,2,n-1);{MH=2+r-1+n-1=n+r,t[2]=2n}
for i := 3 to k+1 do Lenh4(i,1,2,n);
148
{MH=n+r+(k-1)n=kn+r=m,t[i]=2n,i=3..k+1}
close(g); exit;
end;
{ k = 0, r > 0 }
Lenh2(1,1); {1 Doc,d[1]=0,t[1]=1}
{ Bo nhung nguoi vo ich }
for i:=3 to n do Lenh4(i,1,2,n);{MH=x,t[i]=2n,i=3..n}
{ n-1 thao tac vo ich cua 2 }
Lenh4(2,1,2,n-1);{MH=x,t[2]=2(n-1)}
Lenh2(1,2); {1 Ghi,MH=1,t[1]=2}
Lenh2(2,1); {2 Doc,MH=1,d[2]=1,t[2]=2n-2+1=2n-1}
{ Cac thao tac vo ich cua 1 }
Lenh4(1,1,2,n-r+1);{MH=x,t[1]=2+2(n-r+1)=2(n-r+2)}
Lenh2(2,2); {MH=2,t[2]=2n}
Lenh4(1,1,2,r-2);{MH=2+r-2=r=m,t[1]=2(n-r+2)+2(r-2)=2n}
close(g);
end;
Bn c th vit thm th tc test kim tra xem lch xp v ghi trong tp KH.OUT c tha cc
yu cu ca u bi hay khng. Th tc s dng cc mng sau y. Mng d[1..n], d[i] l s nh trong u
ngi s i. Mng t[1..n], t[i] l s ln ngi th i thc hin cc thao tc c (1), Ghi (2). Do thao tc c
phi thc hin trc v hai thao tc c - Ghi phi an xen nn thi im st trc thao tc c ca ngi
th i ta phi c t[i] l s chn v thi im st trc thao tc Ghi phi c t[i] l s l. Mi ln c 1 dng
lnh th tc phi xt xem dng lnh cha 2 hoc 4 s. Th tc phi thc hin cc kim tra sau y.
Kim tra lnh dng i v: 1 s i s n, v = 1 hoc 2. Nu v = 1 th t[i] phi l s chn, nu v = 2 th t[i]
phi l.
Kim tra lnh dng i v1 v2 k: tng t nh trn.
Thc hin lnh i v: Nu v = 1 (thao tc c) th gn d[i] := MH; ngc li, nu v = 2 (ghi) th gn
MH := d[i] + 1. Trong c hai trng hp u tng con m lnh t[i] thm 1 n v.
Sau khi c xong tp KH.OUT phi duyt li cc con m m bo rng d[i] = 2.n vi mi i =
1..n. Cui cng kim tra xem MH = m?
procedure DocLenh(var i,t1,t2,k,v: integer);
begin
read(g,i,t1); v := 2;
if seekeoln(g) then exit;
readln(g,t2,k); v := 4;
end;
procedure XemLenh(i,t1,t2,k,KieuLenh: integer);
begin
if KieuLenh = 2 then writeln(i,bl,t1)
else writeln(i,bl,t1,bl,t2,bl,k);
end;
function Lenh(i,c: integer): Boolean;
begin
Lenh := false;
if (i < 1) or (i > n) then exit;
case c of
1: begin
if odd(t[i]) then exit;
inc(t[i]); d[i] := mh;
end;
2: begin
if not(odd(t[i])) then exit;
inc(t[i]); mh := d[i]+1;
end;
149
else exit;
end;
Lenh := true;
end;
function KiemTraLenh(i,t1,t2,k,v: integer): Boolean;
var j: integer;
begin
if v = 2 then KiemTraLenh := Lenh(i,t1)
else
begin
KiemTraLenh := false;
for j := 1 to k do
begin
if not Lenh(i,t1) then exit;
if not Lenh(i,t2) then exit;
end;
KiemTraLenh := true;
end;
end;
procedure Test;
var i,t1,t2,k,v,n2: integer;
begin
mh := 0;
fillchar(d,sizeof(d),0);
fillchar(t,sizeof(t),0);
assign(g,gn); reset(g);
while not Seekeof(g) do
begin
DocLenh(i,t1,t2,k,v);
XemLenh(i,t1,t2,k,v);
if not KiemTraLenh(i,t1,t2,k,v) then
begin
writeln('Sai '); close(g);
exit;
end;
end;
n2 := n+n;
for i:=1 to n do
if (t[i] <> n2) then
begin
writeln('Sai '); close(g);
exit;
end;
if (mh <> m) then
begin
writeln('Sai '); close(g);
exit;
end;
writeln('Dung');
close(g);
end;
Chng trnh C#
// C#
using System;
150
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace SangTao2 {
class KhoaHoc {
const string fn = "KH.INP";
const string gn = "KH.OUT";
const int MN = 1002;
static int[] d = new int[MN]; // So nho trong dau
static int[] t = new int[MN]; // con dem thao tac
static int n; // nha khoa hoc
static int m; // man hinh cuoi
static int mh;
static StreamWriter g;
static StreamReader f;
static void Main(string[] args){
Run();
}
static void Run() { // Kiem tra tren 1 file
Doc();
Console.WriteLine("n = " + n + " m = " + m);
XepLich();
Console.WriteLine("Output file " + gn);
Console.WriteLine(File.ReadAllText(gn));
Console.WriteLine("Now Testing...");
Test();
Console.ReadLine();
}
// Kiem tra file output KH.OUT
static void Test(){
f = File.OpenText(gn);
Array.Clear(d, 0, d.Length);
Array.Clear(t, 0, t.Length);
mh = 0;
int i, t1, t2, k, v;
while (DocLenh(out i, out t1, out t2, out k, out v)){
XemLenh(i, t1, t2, k, v);
if (!KiemTraLenh(i, t1, t2, k, v)){
Console.WriteLine("SAI LENH");
return;
}
}
f.Close();
for (int j = 1, nn = n + n; j <= n; ++j)
if (t[j] != nn){
Console.WriteLine("SAI SO THAO TAC" + t[j]);
return;
}
if (mh != m) Console.WriteLine("SAI KET QUA MH");
else Console.WriteLine(" LAP LICH DUNG "); }
static bool KTLenh2(int i, int tt){
switch (tt){
case 1: if (t[i] % 2 != 0) return false;
++t[i]; d[i] = mh; return true;
case 2: if (t[i] % 2 == 0) return false;
151
++t[i]; mh = d[i] + 1; return true;
default: return false;
}
}
static bool KiemTraLenh(int i, int t1, int t2,
int k, int v){
if (i < 1 || i > n) return false;
if (v == 2) return KTLenh2(i, t1);
for (int j = 1; j <= k; ++j){
if (!KTLenh2(i, t1)) return false;
if (!KTLenh2(i, t2)) return false;
}
return true;
}
static void XemLenh(int i, int t1, int t2, int k, int v)
{
if (v == 2) Console.WriteLine(i + " " + t1);
else Console.WriteLine(i+" "+t1+" "+t2+" "+k);
}
static bool DocLenh(out int i, out int t1,
out int t2, out int k, out int v){
i = t1 = t2 = k = v = 0;
if (f.EndOfStream) return false;
int[] c = Array.ConvertAll((f.ReadLine()).Split(
new char[] { '\t', ' ' },
StringSplitOptions.RemoveEmptyEntries),
new Converter<String, int>(int.Parse));
foreach (int x in c) ++v;
Console.Write(" v = " + v + ": ");
if (v != 2 && v != 4) return false;
i = c[0]; t1 = c[1];
if (v == 4) { t2 = c[2]; k = c[3]; }
return true;
}
static void Doc(){
int[] v =
Array.ConvertAll((File.ReadAllText(fn)).Split(
new char[] { '\0', '\n', '\t', '\r', ' ' },
StringSplitOptions.RemoveEmptyEntries),
new Converter<String, int>(int.Parse));
n = v[0]; // n nha khoa hoc
m = v[1]; // Gia tri man hinh
}
static void XepLich(){
g = File.CreateText(gn);
if (n < 2 || m < 2 || m > n * n){
g.WriteLine("0");
g.Close();
return;
}
int k = m / n;
int r = m % n;
Console.WriteLine("k = " + k + " r = " + r);
if (r == 0){
Lenh2(1, 1);
for (int i = k + 1; i <= n; ++i)
Lenh4(i, 1, 2, n);
152
Lenh2(1, 2);
Lenh4(1, 1, 2, n - 1);
for (int i = 2; i <= k; ++i) Lenh4(i, 1, 2, n);
g.Close();
return;
}
if (k > 0){
Lenh2(1, 1); // 1 Doc
// Bo nhung nguoi vo ich
for (int i = k + 2; i <= n; ++i)
Lenh4(i, 1, 2, n);
Lenh2(1, 2); // 1 Ghi
Lenh2(2, 1); // 2 Doc
Lenh4(1,1,2,n-r);//cac thao tac vo ich cua 1
// Tu day la cac thao tac co ich
Lenh2(2, 2); // 2 Ghi
Lenh4(1, 1, 2, r - 1); // 1 DG r-1 lan
Lenh4(2, 1, 2, n - 1); // 2 DG n-1 lan
for (int i = 3, k1 = k + 1; i <= k1; ++i)
Lenh4(i, 1, 2, n);
g.Close();
return;
}
// k = 0
Lenh2(1, 1); // 1 Doc. Tu 3..n vo ich
for (int i = 3; i <= n; ++i) Lenh4(i, 1, 2, n);
Lenh4(2, 1, 2, n - 1);
Lenh2(1, 2); // 1 Ghi
Lenh2(2, 1); // 2 Doc
Lenh4(1,1,2,n-r+1); // Cac thao tac vo ich cua 1
Lenh2(2, 2); // 2 Ghi co ich
Lenh4(1, 1, 2, r - 2); // 1 Ghi not co ich
g.Close();
}
static void Lenh2(int i, int t)
{ g.WriteLine(i + " " + t); }
static void Lenh4(int i, int t1, int t2, int k) {
if (k > 0)
g.WriteLine(i + " " + t1 + " " + t2 + " " + k);
}
} // KhoaHoc
} // SangTao2
phc tp
Thut ton pht sinh v ghi vo file kt qu ti a 2.n
2
dng lnh.
4.9 Chn chic ng h
Olimpic Quc t
C 9 chic ng h in t treo trn mt bng theo s 3 3. Cc ng h c m s t 1 n 9
theo trt t t tri qua phi, t hng trn xung hng di. Mi ng h c 4 im ch gi ng vi cc gi
12, 3, 6 v 9. Gi hin tr ca mi ng h ng vi im sng ^. iu khin cc ng h ngi ta s
dng 9 phm vi cc chc nng c m t nh trong hnh v. Khi nhn vo mt phm th c 4 ng h
ng lot nhy im sng i 90
o
theo chiu kim ng h cng thm 3 gi tnh t gi hin tr. Th d, khi
nhn phm 1 th 4 ng h 1, 2, 4 v 5 s c chnh gi theo lut trn. Bit gi hin ti ca cc ng h.
Hy xc nh mt dy ngn nht cc phm cn nhn cc ng h ng lot tr 12 gi.
153
+
+
+
S b tr
9 ng h
^
+
+
+
^
+
+
^
+
C C C
C 9h C 6h C 9h C C
+
^
+
C
^
+
+
+
+
^
+
+
+
C 9h C 12h 3h
^
+
+
+
+
+
+
+
+
9 phm
iu khin
+
^
^
C 12h 6h 6h 1 2 3
4 5 6
9 ng h, ^ gi ang tr
7 8 9
D liu vo: tp vn bn DONGHO.INP gm 12 dng
3 dng u tin gm 9 s tr gi ti thi im u b tr theo ma trn 3 3.
Dng th i trong s 9 dng tip theo, i = 1, 2, 3, 4 ghi 4 s t nhin th hin m s ca 4 ng h s
nhy im sng 90
o
khi ta nhn phm i.
Cc s trn cng dng cch nhau qua du cch.
D liu ra: Tp vn bn DONGHO.OUT gm hai thng tin:
- Bi ton c nghim (ghi s 1) hoc v nghim (ghi s 0).
- Dy phm ngn nht cn nhn cho trng hp c nghim.
DONGHO.INP DONGHO.OUT
9 6 9
9 12 3
12 6 6
1 2 4 5
2 3 5 6
4 5 7 8
5 6 8 9
1 2 3 5
1 4 5 7
3 5 6 9
5 7 8 9
1
1 2 4 4
154
2 5 6 8
ngha: Nhn ln lt cc phm 1, 2, 4,
4
c 9 ng h u ng lot tr 12 gi.
Thut ton
Ta nhn thy rng do cc ng h hot ng c lp vi nhau nn dy phm cn nhn l giao hon,
ngha l c th lit k dy phm theo trt t ty . Th d, nhn cc phm 1, 2, 3 s mang li kt qu nh
khi nhn dy phm 2, 1, 3 hoc theo bt k hon v no ca 3 phm . Ngoi ra, nu mt phm c nhn
n mt bi ln ca 4 th im sng tr gi s quay li ng v tr ban u, do ta khng di g m nhn
mt phm qa 3 ln. T hai nhn xt trn ta thy rng c th dng k thut vt cn, c th l xt cc t hp
dy phm p[1..9], p[i] = 0..3 biu th s ln bm phm i. Vi mi t hp p ta tnh xem cc ng h c cp
nht ra sao. Nu c 9 ng h u nhy v thi im 12 gi th ta chn phng n c s ln bm phm t
nht trong s cc t hp ng vin.
Di y l mt vi chi tit s dng trong
chng trnh. Ta khi to sn mng hai chiu m t
chc nng ca cc phm iu khin, phim[i,j] cho
bit khi nhn phm i th ng h j s c chnh.
var
phim: array[1..9,1..4] of
integer;
Sau khi c d liu ng vi th d c th th
mng phim s c gn tr nh sau:
phim = ((1,2,4,5),
(2,3,5,6),
(4,5,7,8),
(5,6,8,9),
(1,2,3,5),
(1,4,5,7),
(3,5,6,9),
(5,7,8,9),
(2,5,6,8));
Bn cng nn m t sn mt kiu mng 9 phn
t biu th cc phm v cc ng h.
type mi1 = array[1..9] of
integer;
var
dongHo: mi1;
f: text;
imin, imax: longint;
Bn c th s dng 9 vng for lng nhau ng
vi 9 phm, mi vng bin thin t 0 n 3 ng vi s
ln nhn phm.
Bin ts dng tnh tng s ln nhn phm. D
thy, mi phm c nhn ti a 3 ln, vy 9 phm s
c nhn ti a 9.3 = 27 ln. Ta ly 28 lm ga tr
khi u cho vic tnh tsmin - tng s ln nhn phm t nht. Ta cng nn chuyn cc s trn mt ng h
l (12,3,6,9) sang cc s h 4 l (0,1,2,3) cho tin tnh ton. Hm Sum(p) tnh tng 9 phn t ca mng p
- chnh l tng s ln nhn phm ca phng n p. Hm KiemTra(q) thc hin vic kim tra xem 9 ng
h c cng tr n 12h hay khng, q[i] l s ln ng h i c cp nht khi thc hin phng n p.
1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6
7 8 9 7 8 9 7 8 9
1 2 3
1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6
7 8 9 7 8 9 7 8 9
4 5 6
1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6
7 8 9 7 8 9 7 8 9
7 8 9
Chc nng ca cc phm iu khin
155
Bn cng c th s dng h 4 x l nh sau: Cc phng n nhn 9 phm bin thin t
(0,0,0,0,0,0,0,0,0) n (3,3,3,3,3,3,3,3,3) ng vi imin = 0 v imax = 4
9
-1 = 2
18
-1 = (1 shl 18) - 1 =
262143. Ta cho i bin thin t imin n imax. Vi mi i ta xy dng phng n nhn phm bng cch gi
th tc Split(i,p) chuyn s i sang dng biu din h 4 ghi vo mng p, trong p[j] s l s ln nhn
phm j. Bit p ta d dng cp nht cc ng h.
Chng trnh di y ci t 2 phng n vt cn, Run1 chn vng for lng nhau v Run2 - tnh
ton theo h 4.
(* Pascal *)
(* Dong ho *)
const bl = #32; fn = 'DONGHO.INP'; gn = 'DONGHO.OUT';
type mi1 = array[1..9] of integer;
var
dongHo,kq: mi1;
f,g: text;
imin, imax: longint;
s, tsmin: integer;
var
phim: array[1..9,1..4] of integer;
procedure Split(x: longint; var a: mi1);
var i: integer;
begin
for i := 1 to 9 do
begin
a[i] := x mod 4;
x := x div 4;
end;
end;
procedure Doc;
var i,j: integer;
begin
assign(f,fn); reset(f);
for i:=1 to 9 do read(f,dongHo[i]);
for i:=1 to 9 do
for j:=1 to 4 do read(f,phim[i,j]);
close(f);
end;
procedure Ghi;
var i,j: integer;
begin
assign(g,gn); rewrite(g);
if tsmin = 28 then writeln(g,0) { vo nghiem }
else
begin { co nghem }
writeln(g,1);
for i := 1 to 9 do
for j := 1 to c[i] do write(g,i,bl);
writeln(g);
end;
close(g);
end;
procedure Init;
var i: integer;
begin
for i:=1 to 9 do dongHo[i] := (dongHo[i] div 3) mod 4;
imin := 0;
156
imax := 1;
imax := (imax shl 18 - 1);
end;
function KiemTra(var q: mi1): Boolean;
var i: integer;
begin
KiemTra := false;
for i:=1 to 9 do
if (dongHo[i]+q[i]) mod 4 <> 0 then exit;
KiemTra := true;
end;
function Sum(var q: mi1): integer;
var i,s: integer;
begin
s := 0;
for i:=1 to 9 do s := s+q[i];
Sum := s;
end;
procedure XuLiFor;
var j,k,ts: integer;
q,p: mi1; { p[i] so lan nhan phim i }
i,ikq: longint;
begin
tsmin := 28; { = 3*9+1 }
for p[1] := 0 to 3 do
for p[2] := 0 to 3 do
for p[3] := 0 to 3 do
for p[4] := 0 to 3 do
for p[5] := 0 to 3 do
for p[6] := 0 to 3 do
for p[7] := 0 to 3 do
for p[8] := 0 to 3 do
for p[9] := 0 to 3 do
begin
fillchar(q,sizeof(q),0);
for j := 1 to 9 do
begin
for k := 1 to 4 do
inc(q[phim[j,k]],p[j]);
end;
if KiemTra(q) then
begin
ts := Sum(p);
if ts < tsmin then
begin
tsmin := ts;
kq := p;
end;
end;
end;
end;
procedure XuLi;
var j,k,ts: integer;
q,p: mi1;
i,ikq: longint;
begin
tsmin := 28; { = 3*9+1 }
157
for i:=imin to imax do
begin
Split(i,p); { bam phim j p[j] lan }
fillchar(q,sizeof(q),0);
for j := 1 to 9 do
begin
for k := 1 to 4 do
inc(q[phim[j,k]],p[j]);
end;
if KiemTra(q) then
begin
ts := Sum(p);
if ts < tsmin then
begin
tsmin := ts;
ikq := i;
end;
end;
end;
Split(ikq,kq);
end;
procedure Run1;
begin
Doc; Init;
XuLiFor; Ghi;
end;
procedure Run2;
begin
Doc; Init;
XuLi; Ghi;
end;
BEGIN
Run1;
END.
Chng trnh C#
// C#
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace SangTao2 {
class DongHo {
const string fn = "DONGHO.INP";
const string gn = "DONGHO.OUT";
const int cc = 9;
static int[,] phim = new int [9,4];
static int[] dongHo = new int[cc];
static int [] kq = new int [cc];
static int smin = 0; // Tong so lan nhan phim
static void Main(string[] args) {
Run2();
Console.ReadLine();
}
static void Run1(){
158
Doc(); Init(); XuLi(); Ghi(); XemKq();
}
static void Run2(){
Doc(); Init();
XuLiFor(); Ghi(); XemKq();
}
static void XuLiFor(){
int [] p = new int [cc];// 9 phim
int[] dh = new int[cc];//so lan nhay kim cua 9 DH
int s = 0;
smin = 28;
for (p[0]=0; p[0] < 4; ++p[0])
for (p[1]=0; p[1] < 4; ++p[1])
for (p[2]=0; p[2] < 4; ++p[2])
for (p[3]=0; p[3] < 4; ++p[3])
for (p[4]=0; p[4] < 4; ++p[4])
for (p[5]=0; p[5] < 4; ++p[5])
for (p[6]=0; p[6] < 4; ++p[6])
for (p[7]=0; p[7] < 4; ++p[7])
for (p[8]=0; p[8] < 4; ++p[8]){
Array.Clear(dh,0,dh.Length);
for (int j = 0; j < cc; ++j)
//phim j nhan p[j] lan
for (int k = 0; k < 4; ++k)
// 4 DH chuyen kim
dh[phim[j, k]] += p[j];
if (KiemTra(dh)){
s = Sum(p);
if (s < smin){
smin = s;
p.CopyTo(kq,0);
}
}
}
}
static int Sum(int []p){ // Tong so lan nhan phim
int s = 0;
for (int i = 0; i < cc; ++i) s += p[i];
return s;
}
static void Doc() { // Doc du lieu tu input file
int[] v =
Array.ConvertAll((File.ReadAllText(fn)).Split(
new char[] { '\0', '\n', '\t', '\r', ' ' },
StringSplitOptions.RemoveEmptyEntries),
new Converter<String, int>(int.Parse));
int k = 0;
for (int j = 0; j < cc; ++j) dongHo[j] = v[k++];
for (int i = 0; i < cc; ++i)
for (int j = 0; j < 4; ++j)
phim[i, j] = v[k++];
}
static void Init() { // Khoi tri
for (int j = 0; j < cc; ++j)
dongHo[j] = (dongHo[j] / 3) % 4;
for (int i = 0; i < cc; ++i)
for (int k = 0; k < 4; ++k)
159
--phim[i, k];
}
static void XuLi(){
int imax = ((int)1 << 18) - 1;
int[] p = new int[cc]; smin = 28;
int[] q = new int[cc];
for (int i = 0; i <= imax; ++i){
int s = Split(i, p);
Array.Clear(q, 0, q.Length);
for (int j = 0; j < cc; ++j)
for (int k = 0; k < 4; ++k)
q[phim[j, k]] += p[j];
if (KiemTra(q))
if (s < smin){ smin = s; p.CopyTo(kq,0); }
}
}
static void Ghi(){
StreamWriter g = File.CreateText(gn);
if (smin < 28) { // co nghiem
g.WriteLine(1);
for (int i = 0; i < cc; ++i)
for (int j = 1; j <= c[i]; ++j)
g.Write((i + 1) + " ");
}
else g.WriteLine(0); // vo nghiem
g.Close();
}
static bool KiemTra(int[] q)// Kiem tra ca 9 DH tro ve 0?
{
for (int i = 0; i < cc; ++i)
if ((dongHo[i] + q[i]) % 4 > 0) return false;
return true;
}
// Tach x thanh cac chu so he 4 va tinh tong
static int Split(int x, int[] p){
int s = 0;
for (int i = 0; i < cc; ++i)
{ p[i] = x % 4; s += p[i]; x /= 4; }
return s;
}
static void XemKq(){
Console.WriteLine("\n Input file " + fn);
Console.WriteLine(File.ReadAllText(fn));
Console.WriteLine("\n Output file " + gn);
Console.WriteLine(File.ReadAllText(gn));
}
} // DongHo
} // SangTao2
4.10 S duy nht
Olimpic Baltics
Tp vn bn UNIQUE.INP cha dy s, mi s chim mt dng di khng qu 20 ch s. Trong
dy ny c duy nht mt s xut hin ng mt ln, cc s cn li u xut hin ng k ln. Hy tm s duy
nht . S k khng cho trc, nhng bit rng l mt s chn khc 0. Kt qu hin th trn mn hnh.
160
Thut ton
Ta da vo mt kin thc c t hng ngn nm trc, l biu din s theo v tr. Ta ln lt c
tng dng vo mt bin string sau ghi vo mt mng a s ln xut hin ca tng ch s ti tng v tr,
a[c,i] cho bit s ln xut hin ca ch s c ti ct i tnh t tri qua phi.
Vi th d cho, trn ct 1 ta tnh c a[1,1] = 5, a[2,1] = 4, a[3,1] = 0,... , a[8,1] = 4...
Nh vy mng a c kch thc 10 hng cha 10 ch s 0..9 v 20 ct cha cc ch s di nht.
Sau khi c xong d liu, ta thy mi phn t ca mng a hoc l chia ht cho k do l s chn, hoc l
s l c dng m.k + 1, m = 0, 1, 2,... Nu a[c,i] l s l th c s l ch s xut hin ti ct i ca s duy nht
cn tm.
Chng trnh Pascal
(* Pascal *)
procedure XuLi;
const mn = 20;
ChuSo = ['0'..'9'];
fn = 'unique.inp';
var a: array['0'..'9',1..mn] of integer;
f: text;
i: integer;
s: string;
cs: char;
begin
fillchar(a,sizeof(a),0);
assign(f,fn); reset(f);
while not seekeof(f) do
begin
readln(f,s);
for i:=1 to length(s) do
if s[i] in ChuSo then inc(a[s[i],i]);
end;
close(f);
s := ''; { Ket qua }
for i := 1 to mn do
for cs := '0' to '9' do
if Odd(a[cs,i]) then s := s+cs;
writeln(s);
end;
BEGIN
XuLi;
readln;
END.
Chng trnh C#
// C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
UNIQUE.IN
P
MN HNH
1357
2008
80
1357
2008
80
2008
1357
10203040
80
2008
80
1357
10203040
Gii thch: S duy nht cn tm
l 10203040. Cc s cn li
u xut hin 4 ln.
161
namespace SangTao2 {
class Unique {
const string fn = "UNIQUE.INP";
static void Main(string[] args){
Console.WriteLine(XuLi());
Console.ReadLine();
}
static string XuLi(){
string s;
StreamReader f = File.OpenText(fn);
int mn = 20;
int [,] a = new int[10,mn];
Array.Clear(a, 0, a.Length);
while (true){
s = f.ReadLine().Trim();
if (s.Length == 0) break;
for (int i = 0; i < s.Length;++i)
if (s[i] >= '0' && s[i] <= '9')
++a[s[i]-'0',i];
}
f.Close();
string kq = "";
for (int i = 0; i < mn; ++i)
for (int cs = 0; cs <= 9; ++cs)
if (a[cs, i] % 2 == 1)
kq += cs;
return kq;
}
} // Unique
} // SangTao2
phc tp
Nu c n s di ti a m ch s th ta cn xt mi ch s 1 ln, ngha l tng cng cn n.m thao tc.
Duyt mng a cn 10.m thao tc l s rt nh so vi n.m.
Cc bin th ca bi UNIQUE
1. Nu u bi cho bit s k th khng cn i hi k l s chn.
2. Bit duy nht mt s xut hin ng m ln, cc s cn li u xut hin k ln nh nhau, k = m v
k v m nguyn t cng nhau. Bn th suy ngh xem c cn bit c th cc gi tr ca m v k khng? Bn
th tm mt s iu kin ca k v m?
3. Thay cc s bng cc dy k t A..Z di ti a m.
________________________
21.01.2010
NXH