Вы находитесь на странице: 1из 51

..

1997


1
1.1 . . . . . . . . . . . . .
1.2 . . . . . . . . .

2
2
9

2
14
2.1 . . . . . . . . . . . . . 15
2.2 . . . . . . . . . . 17
2.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3 K-
23
3.1 k- . . . . . . . . . . . . . . . 24
4

30

5
34
5.1 -.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2 . . . . . . . . . . 36
5.3 . . . . . . . 36
6

38

7 ()

40

45

48

1.
1.1.
n-
. ,
,
.
.

, : f g , f < g,
f g.
, ,
. ,
, .
.
, . , .
,
.
. , , , ? , n-
2

n!,
16- ( !).

. ,
. ,
, (
) , . ,
, , .
{1, 2, . . . , n}
.
.
1. f = a1 , . . . , an , g = b1 , . . . , bn , , f < g
, k 1 , ak < bk aq = bq q < k.
. n = 4 :
1. 1, 2, 3, 4 7. 2, 1, 3, 4 13. 3, 1, 2, 4 19. 4, 1, 2, 3
2. 1, 2, 4, 3 8. 2, 1, 4, 3 14. 3, 1, 4, 2 20. 4, 1, 3, 2
3. 1, 3, 2, 4 9. 2, 3, 1, 4 15. 3, 2, 1, 4 21. 4, 2, 1, 3
4. 1, 3, 4, 2 10. 2, 3, 2, 4 16. 3, 2, 4, 1 22. 4, 2, 3, 1
5. 1, 4, 2, 3 11. 2, 4, 1, 3 17. 3, 4, 1, 2 23. 4, 3, 1, 2
6. 1, 4, 3, 2 12. 2, 4, 3, 1 18. 3, 4, 2, 1 24. 4, 3, 2, 1
. , n-
( 0, 1, . . ., n 1, n).
, n .

n. ,
, , ,
.
:
1 ,
( n).
2 n (n 1)!,
. n 1
, p ,
{1, . . . , n} \ {p} .

4-. , 4- ,
1- 1, 2 . , ,
2- 4- , . {2, 3, 4};
{1, 3, 4}; {1, 2, 4}; {1, 2, 3}. ,
, 2- 4- , ,
( 1 ).
, , ,
2- 4- , 1 2. 2
:
3

3 n (n 1) . . . (n k +
1) p1 , . . . , pk , k .
p1 , . . . , pk q1 , . . . , qk , p1 , . . . , pk q1 , . . . , qk
. ,
, k+1- n- ,
.
, .
:
4 . ,
.
1 .
, ,
.
. 4- , :
2, 1, 4, 3 , 7. 2, 1, 3, 4 8. 2, 1, 4, 3, 4, 3
3, 1, 2, 4 ,
13. 3, 1, 2, 4, 4
2, 4, 3, 1
, 4, 3, 1
4, 3, 2, 1
4- , .
,
? :
1.
2. , , ,
( ,
)
3. , , ,
4. , 3 , ( )
. 2, 1, 4, 3 2, 3, 1, 4, 3, 1, 2, 4 3, 1, 4, 2.
15- 15, 2, 4, 3, 1, 13, 7, 10, 14, 12, 11, 9, 8, 6, 5, 15, 2, 4, 3, 1, 13, 7, 11, 5, 6, 8, 9, 10, 12, 14
. :
4

1. n = 3, 2, 3, 1
2. n = 5, 2, 5, 4, 3, 1
3. n = 7, 4, 5, 2, 3, 1, 6, 7
4. n = 8, 2, 4, 3, 6, 8, 7, 5, 1
. ,

. .
. :
p = p1 , . . . , pk , . . . , pj , . . . , pn , 1 k < n, pk < pk+1 q: k < q <
n pq > pq+1 ( p = n, n 1, . . . , 1, k = 0), j > k pj > pk q:
j < q n pq < pk ; p , k = 0,
p1 , . . . , pk1 , pj , pn , pn1 , . . . , pj+1 , pk , pj1 , . . . , pk+1 .
. k j ,
pk pj , :
program LEX;
const n = ...; { }
var p: array [0..n] of 0..n; { }
k: 0..n;
j, r, m: 1..n;
begin
for k := 0 to n do
p[k] := k; { }
k := 1;
while k <> 0 do
begin
for k := 1 to n do
write(p[k]);
writeln; { }
k := n-1;
while p[k] > p[k+1] do
k := k - 1; {c k}
j := n;
while p[k] > p[j] do
j := j - 1; { j}
r := p[k];
p[k] := p[j];
p[j] := r; { pk pj }
j := n;
m := k + 1;
while j > m do { }
begin
r := p[j];
p[j] := p[m];
p[m] := r;
j := j - 1;
m := m + 1
5

end
end
end.
. p ,
{ k} .
. n = 3.
. , ,

[3]. , ,
n! , ..
, , O(n!) .
n!. ,
, .
, ,
{ k} { j}.
. Tk ,
LEC(n-k+1), .. Tk ,
k- .
Tk = k Tk1 + (k 1) (1 +

k1
k+1
) = k Tk1 + (k 1)

2
2

= .
LEC(n-k),
, {3} {4}. , T1 = 0.
. Sk =
k+1
Tk +
,
2
S1 = 1, Sk = k (Sk1 + k1 ) ,
k = 0, k , k = 1, k .
:
(k1)/2

Sk = k!

j=0

..

(k1)/2

Tk = k!
,

1
j=0 (2j)!

j=0

1
,
(2j)!

k+1
1

(2j)!
2

ch(1) 1.543 (k + 1)/2 = o(k!),


Tk k! ch(1) ,

.. ch(1) 1.543 .
{ k}
{ j}; Cn .
6

Cn Cn1 . , n ,
2, Cn1 , n. ,
{ k} n 1 , { j}
p p + 1 (1 p < n) p , ..
Cn = n Cn1 + (n 1) (n 1) + 1 + . . . + (n 1) ,

C1 = 0

Cn = n Cn1 + (n 1) (3n 2)/2 ,

C1 = 0

Dn = Cn + (3n + 1)/2, D1 = 2, Dn = n Dn1 + 3/2,


1 3/2
Dn = n! ( +
)
2 i=1 i!
n

1
3
3
, e =
i=0 i! , Dn n!( 2 e1) , Cn = n!( 2 e1)(3n+1)/2,
Cn
3
, (3n + 1)/2 = o(n!), n! = 2 e 1. ,
LEX 32 e 1 3.077 .
.
,
.
13. :
program LEX1 (output);
const n = ...; {n }
var p: array [1..n] of 1..n;
i, r: 1..n;
procedure INVERT(m: integer); { p[m]...p[n] }
var i, j: 1..n;
begin
i := m;
j := n;
while i < j do
begin
r := p[i];
p[i] := p[j];
p[j] := r;
i := i + 1;
j := j - 1
end
end {INVERT};
procedure Lec(k:integer);
var i: 1..n;
begin
if k = n then
{1} begin
for i := 1 to n do
write(p[i]);
writeln
end
else
for i := n downto k do
{2}
begin
7

LEC(k+1);
if i > k then
begin
r := p[i];
p[i] := p[k];
p[k] := r;
{3}
INVERT(k+1)
{4}
end
end
end {LEC};
begin
for i := 1 to n do
p[i] := i;
LEC(1)
end.
. INVERT ( 1) . LEC ( {1}), n
, ( 2) n k + 1 n k + 1 n k
k .
n = 3
{2} k=1
{2} k=2
{1} k=3
{3} k=2
{4} k=2
{2} k=2
{1} k=3
{3} k=1
{4} k=1
{2} k=1
{2} k=2
{1} k=3
{3} k=2

i=3
i=3
i=3

{4}
{2}
{1}
{3}
{4}
{2}
{3}
{1}
{3}
{4}
{2}
{3}

1 2 3
p = 1 3 2
p = 1 3 2

i=2
i=3

1 3 2
p = 2 3 1
p = 2 1 3

i=2
i=3
i=3

2 1 3
p = 2 3 1

k=2
k=2
k=3
k=1
k=1
k=1
k=2
k=3
k=2

p = 2 3 1
i=2
i=2
i=3
i=3
i=3
i=3

k=3 i=2
k=2

2 3 1
p = 3 2 1
p = 3 1 2
3 1 2
p = 3 2 1
p = 3 2 1
3 2 1

. LEC.
. , p[k] < . . . < p[n],
LEC(k) p[k], . . . , p[n] p[1], . . . , p[k 1].
,
LEC, n .
Bn LEC n-
LEX1. Bn :
B1 = 1, Bn = n Bn1 + 1

Bn = n! ni=1 i!1 . ,
e 1 LEC.
8

LEX LEX1. ,
: e 1
3.077 .

.
2. f = a1 , . . . , an , g = b1 , . . . , bn , , f < g
, k n , ak > bk aq = bq
q > k.
. n = 4 :
1. 1, 2, 3, 4 7. 1, 2, 4, 3 13. 1, 3, 4, 2 19. 2, 3, 4, 1
2. 2, 1, 3, 4 8. 2, 1, 4, 3 14. 3, 1, 4, 2 20. 3, 2, 4, 1
3. 1, 3, 2, 4 9. 1, 4, 2, 3 15. 1, 4, 3, 2 21. 2, 4, 3, 1
4. 3, 1, 2, 4 10. 4, 1, 2, 3 16. 4, 1, 3, 2 22. 4, 2, 3, 1
5. 2, 3, 1, 4 11. 2, 4, 1, 3 17. 3, 4, 1, 2 23. 3, 4, 2, 1
6. 3, 2, 1, 4 12. 4, 2, 1, 3 18. 4, 3, 1, 2 24. 4, 3, 2, 1
.
1. 1-3 ,
13 .
2. .
3. ANTILEX, ( [1]).
4. ANTILEX1, .

1.2.
,
.
. aij n.

a[1, i1 ] a[2, i2 ] . . . a[n, in ]


(1)
i1 i2 . . . in n- .
(1) 1 ||aij || . , O(n!), n- . , , . , , ,
, .
.
, n-
. . ,
1

.
. , [3].

.
, [ik , ij ], k = j; , ,
, n , (1), , , , a[j, ij ]

, .. (,
a[k, ik ]
a[k, ik ] = 0).

,
. ,
[2].
p[1], . . . , p[n] PERM(m), ,
p[1], . . . , p[m], 1 m n, , . n- n PERM(n-1), ,
, p[n], p[1], . . . , p[n 1] , p[n] .
PERM(m) :
procedure PERM(m: integer); {1 m n}
var i,k: integer;
{p, b }
begin
if m = 1 then
{p[1], ... , p[n] }
for i := 1 to n do
write(p[i])
else
for i := 1 to m do
begin
PERM(m-1);
if i < m then
begin
k := p[m];
{*}
p[m] := p[b[m,i]];
p[b[m,i]] := k
end
end
end;
, p[m] i- PERM(m1) p[b[m,i]]. ,
bm , , {*}
p[m]. bm ?
. ,


b[1, 1] . . . b[1, m]


..
..
..
.
.
.


b[m, 1] . . . b[m, m]
10

. , b[j, i], i j n,
( ). bm+1 b[m + 1, 1], b[m + 1, 2], . . . , b[m + 1, m]. m
1, . . . , m: m (i) = j, , p[j]
p[i] PERM(m). b[m + 1, 1]
1, . . . , m, k1 . b[m + 1, 2] 1, . . . , m,
m (k1 ); k2 . b[m + 1, 3] 1, . . . , m,
m (m (k1 )) = 2m (k1 ) m (k2 ); k3 , .. b[m + 1, m]
m1
1, . . . , m, m
m (k1 ), m (k2 ), . . . , m (km1 ).
.

b1 = ,





b2 =
1 ,







b3 =
1 ,
1 1




1
b4 =
1

1

1
2

p 1 2 3 4, PERM(4) b4 :
1. 1, 2, 3, 4 7. 4, 2, 1, 3 13. 1, 3, 4, 2 19. 4, 3, 2, 1
2. 2, 1, 3, 4 8. 2, 4, 1, 3 14. 3, 1, 4, 2 20. 3, 4, 2, 1
3. 3, 1, 2, 4 9. 1, 4, 2, 3 15. 4, 1, 3, 2 21. 2, 4, 3, 1
4. 1, 3, 2, 4 10. 4, 1, 2, 3 16. 1, 4, 3, 2 22. 4, 2, 3, 1
5. 2, 3, 1, 4 11. 2, 1, 4, 3 17. 3, 4, 1, 2 23. 3, 2, 4, 1
6. 3, 2, 1, 4 12. 1, 2, 4, 3 18. 4, 3, 1, 2 24. 2, 3, 4, 1
. b3 b4 ,
1 2 3 4, , 24-, 4 1 2 3
3.

1. , bn bn ,
,
2. , ,
1 2 . . . n,

.
1. , PERM
.
2. ,
Tn n
n1
i!
i=1
2 , Tn n- ,
.
. bm
(.. bij , j i) PERM. bm
b1 m(m 1)/2.
11

. perm , bm b1,
b21 , b31 , b32 , . . . , bn1 , bn2 , . . . , bnn 1.
bm bm
m i.
. b(m, i:integer): integer; {m>i}
function
begin
if (m mod 2 = 0) and m > 2 then
if i < m-1 then
b := 1
else
b := m-2
else
b := m-1
end;
. b5 , b, , PERM .
n ( [2],
b(m, i).)
, perm,
, .
. perm,
1, . . . , n, .. , i, 1 i n,
p[i] = i.
, , ,
perm? .
. n = 4.
1. 1234 7. 1342
2. 1243 8. 1324
3. 1423 9. 3124
4. 4123 10. 3142
5. 4132 11. 3412
6. 1432 12. 4312

13.
14.
15.
16.
17.
18.

4321
3421
3241
3214
2314
2341

19.2431
20. 4231
21. 4213
22. 2413
23. 2143
24. 2134

, ,
. , n. , (n 1)- n ,
n, n- (n 1
1 ). ,
1, 2, . . . , n 1, . 1, 2, . . . , n
, n 1, 2, . . . , n 1. n
(n 1)! .
. , 4 1 5 6 3 2 4 1 5 3 6 2. n- ?
12

,
perm. , perm
p[n] (n 1)! ,
p[n] (n 1)-
.
. , n
perm, .

. , : n-
(n 1)- . O((n 1)!). , ,
.
, a1 . . . an , ; ,
ak , 1 k n, ,
.
d n, i- 1, i ( ), -1, i
. , i
.
, , ; ..
ak , ak -
. a1 . . . an
n + 2, n + 1, a1 , . . . , an , n + 1.
a1 . . . an ,
.
r, a1 . . . an .
:
program gen(input, output);
const n = ; n1 = ; {n1 = n + 1}
var
p: array [0..n1] of 1..n1;
{p[1],...,p[n] - }
r: array [1..n] of 1..n;
{r - , p[1],...,p[n] }
d: array [1..n] of -1..1; {d - }
i, j, k, t: integer;
begin
for i := 1 to n do
begin
p[i] := i;
r[i] := i;
d[i] := -1
13

end;
d[1] := 0;
p[0] := n1;
p[n1] := n1;
i := n;
while i <> 1 do
begin
for j := 1 to n do
write(p[j]);
writeln;
i := n;
while p[ r[i]+d[i] ] > i do
begin
{*}
d[i] := -d[i]; i := i-1 { }
end;
k := r[i];
t := k + d[i];
j := p[t];
p[k] := j; { }
p[t] := i;
r[i] := r[j]; { }
r[j] := k
end
end.
.
1. , ,
1.

2. , {*} ni=1 i! . .
?
3. , n = 4 :
1. 1234 7. 3124 13. 4321 19. 4213
2. 2134 8. 1324 14. 4312 20. 4231
3. 2314 9. 1342 15. 4132 21. 2431
4. 2341 10. 3142 16. 1432 22. 2413
5. 3241 11. 3412 17. 1423 23. 2143
6. 3214 12. 3421 18. 4123 24. 1243
, , . , ..
.
.

2.
. ,
14

SET OF, ( ) .
,
, . , ,
. , ,
, , , .
. , ,
.
, SET OF

.
.
, , , n ,
. i- 1, i- (1 i n) ,
( , ). , ,
.
n .
. X = (1, 0, 0, 0, 1, 1) , , X , .
(0, 0, 0, 0, 0, 0),
(1, 1, 1, 1, 1, 1).
. ,
,
, .

2.1.
4. A = (x1 , . . . , xn ) B = (y1 , . . . , yn ), xi , yi {0, 1}, 1 i n.
, A B ,
i, 1 i n, xi < yi xj = yj j, 1 j < i; A < B.
. 0 a < b < 2n , a, b ;
a b

n a = ni=1 xi 2ni b = ni=1 yi


2ni . , (x1 , . . . , xn ) < (y1 , . . . , yn ).
, .
program SET1(output);
const n = ;
n1 = ; {n1 = n + 1}
var s: array [1..n1] of 0..1;
i, j: integer;
begin
for i := 1 to n1 do
s[i] := 0;
15

while s[n1] = 0 do
begin
for i := 1 to n do
write(s[i]);
writeln;
i := 1;
{**}
while s[i] = 1 do
begin
s[i] := 0;
i := i + 1
end;
{*}
s[i] := 1
end
end.
. S s, ,
S, s + 1.
.
1. SET1.
2. , {**} 2n+1 1 .
3. .
4. ,
s SET OF 1..n.
.
1. ,
,
, , 8 1 , 16 2 . , (, , ).
SET1
.
2. ,
i
{*}. , {*} 2n , i = n + 1
n-. In i
. In 1, 2, . . . , 2n1 .
In I1 = 1, In = In1 , n, In1 ( n-
2n1 , 1- (n 1)- , 2n1 + 1, . . . , 2n 1
n).
. , In1 = i1 , i2 , . . . , i2n1 , n > 1, In = 1, i1 + 1, 1, i2 +
1, 1, . . . , i2n1 + 1, 1.
16

2.2.

. , , , .
, .
, .
n - .
n=1
1. (0), 1. (1),
2. (1).
2. (0).
n=2
1. (0,0), 1. (0,0),
2. (1,0),
2. (0,1),
3. (1,1),
3. (1,1),
4. (0,1).
4. (1,0).
, , !
n=3
1. (0,0,0)
2. (1,0,0)
3. (1,1,0)
4. (0,1,0)
5. (0,1,1)
6. (1,1,1)
7. (1,0,1)
8. (0,0,1)
. n = 3, .
n=4
0 0
1 0
1 1
0 1
0 1
1 1
1 0
0 0
0
1
1
0
0
1
1
0

0
0
0
0
1
1
1
1

0
0
0
0
0
0
0
0

:
C1 , C2 , . . . , Ck1 , Ck k = 2n n , . ,
n + 1 , , :
C1 0, C2 0; . . . , Ck1 0, Ck 0, Ck 1, Ck1 1, . . . , C2 1, C1 1

(2)

n- .

. Pn .

0 1 1
0 1 1
1 1 1
1 1 1
1 0 1

1 0 1
P1 = 1, Pn = Pn1 , n, Pn1
,n > 1
0 0 1
0 0 1 , n > 0 P = Pn .

n
Pn In .
. n = 4, P4 = I4 = 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1.
17

, m, 1 m n, 2m1 - Pn ,
2m1 .
, :
program SET2(output);
const n = ;
var s: array [1..n] of 0..1;
i: integer;
procedure GRAY (m: integer);
begin
if m = 0 then
begin
for i := 1 to n do
{1}
write(s[i]);
writeln;
end
else
begin
{2}
GRAY(m-1);
{3}
s[m] := 1 - s[m];
GRAY(m-1)
end
end;
begin
for i := 1 to n do
s[i] := 0;
GRAY(n)
end.
.
1. , n = 4 .
2. , {2} GRAY
2m1 .
3. SET2.
4. SET2.
n-
n- ( . [4]),
.
a1 , . . . , an . ,
{1} SET2 write(s[a[i]]), . . , n! -
, .
. n
, ?
18

SET2.
In = Pn :
program SET3;
const n = ;
var s: array [1..n] of 0..1;
i, j, k, p: integer;
begin
{0} for k := 1 to n do
s[k] := 0;
i := 0; {i }
repeat
for k := 1 to n do
write(s[k]);
writeln;
{1}
i := i + 1;
p := 1;
j := i;
{2}
while j mod 2 = 0 do
begin { j*2^(p-1) = i }
j := j div 2;
p := p + 1
end; {p }
if p <= n then
{3}
s[p] := 1-s[p]
{4} until p > n
end.
. {1} i
bm . . . bp 0 . . . 0, bp = 1 ( {1} i
bm . . . bp+1 01 . . . 1 ( SET1)). p {2}. {4} , 2n
.
. SET3.

{2} . .
,
.
. ,
. (.. , ,
). & .
, SET3.
, s . i1 i {1}, .. i1 = i - 1. {0}
s := 0; {2} p := (ii1) & i; {3} s := s p; {4}
i = 2n .
. 16. {1} i = 3984.
19

:
i = 0000 1111 1001 0000
i1 = i 1 = 0000 1111 1000 1111
i i1 = 0000 0000 0001 1111
p = (i i1)&i = 0000 0000 0001 0000
, n , , .
. In = Pn , 0 i < n bn bn1 . . . b0
i, n + 1 Gi = g1 g2 . . . gn i-
, SET3, gk = bnk + bnk+1 , 1 k n.
.
[4]
, .. Pn . Pn
.
:
1. { } n, n1, . . . , 1 ( 1 ).
2. i .
3. i 1, i 2, . . . , 1.
4. 2 , .
.
1. .
2. Pn .
3. .
,
m GRAY SET2, SET2 SET3.
,
3 i 1, i 2, . . . , 1 , i,
.
(t0 , t1 , . . . , tn ), t0
, i > 0 ti ,
i, i . , i 1, i 2, . . . , 1
i t0 1. i ,
ti , , ,
. i + 1, ..
, i + 1 , ,
, i. i
ti1 ti . Pn
:
20

program PN;
const n = ; n1 = ; {n1 = n + 1}
var t: array [0..n] of 1..n1; {}
p: integer;
begin
for p := 0 to n do
t[p] := p + 1; { }
p := 0;
while p < n1 do
begin
p := t[0];
{1}
if p <> n1 then
begin
writeln (p);
{2}
t[p-1] := t[p]; {3}
t[p] := p + 1;
if p <> 1 then
t[0]:=1
{4}
end
end
end.
.
1. PN n = 3.
2. Pn n.
. {1} {2}, {4}
, .. t[0]
{3}.
,
Pn PN :
program SET4;
const n = ; n1 = ; n2 = ; {n1 = n+1; n2 = n+2}
var t: array [0..n1] of 1..n2;
s: array [1..n1] of 0..1;
i, p: integer;
begin
for i := 1 to n1 do
begin
s[i]:=0;
t[i]:=i+1 { }
end;
p := 0;
t[0] := 1;
{1} while p < n1 do
begin
for i := 1 to n do
write(s[i]);
21

writeln;
p := t[0];
s[p] := 1-s[p];
t[0] := 1;
t[p-1] := t[p];
t[p] := p+1
end
end.
. t s n + 1- ,
{1}.

2.3.
, , , . ,
.
. (x, x, x, y, y, z, z, z, u) (3x, 2y, 3z, 1u).
. x < y < z < u, (3x, 2y, 3z, 1u)
(3, 2, 3, 1).
,
n n- , , ,
n- .
.
1.
A = (m1 , . . . , mn ), mi 0, 1 i n. ,
m
i=1 (mi + 1) .
2. A = (m, . . . , m), n . A . , 0
mn 1 m- .
3. A , .
. ( , ,

C1 0; C2 0; . . . ; CP 0; CP 1; . . . ; C1 1; C12 ; . . . ; CP 2; CP 3; . . . ,

p = mn ,

(n + 1)- .
, SET3.)

22

3. K-
, k A n (k
n), k- k-. k, n- , ,
k- .
, , . , k n/2.
( k- , , k-, .) k- n-
. k- , ,
, k-.
. (0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0) (5, 6, 8, 9).
k- .
K-.
5. (a1 , . . . , ak ), a1 < . . . < ak , (b1 , . . . , bk ),
b1 < . . . < bk , i, 1 i k, , j, j < i, aj = bj , ai < bi .
. , . 2.1.
(1, . . . , k),
(n k + 1, . . . , n). (a1 , . . . , ak ) ,
(b1 , . . . , bk ) = (a1 , . . . , ap1 , ap +1, ap +2, . . . , ap +
k p + 1), p = max(i| ai < n k + i). , (b1 , . . . , bk ) , : (b1 , . . . , br1 , br + 1, br + 2, . . . , br + k r + 1), r = p 1,
bk = n, k, bk < n.
. k- . n = 5, k = 2
1. (1,2), p = 2 5. (2,3), p = 2 8. (3,4), p = 2 10. (4,5)
2. (1,3), p = 2 6. (2,4), p = 2 9. (3,5), p = 1
3. (1,4), p = 2 7. (2,5), p = 1
4. (1,5), p = 1
:
program SUBSET1;
const n = ; k= ; {k n}
var s: array[1..k] of 1..n;
i, p: integer;
begin
for i := 1 to k do
{1}
s[i] := i; { K-}
p := k;
while p >= 1 do
begin
for i := 1 to k do { K-}
write(s[i]);
writeln;
if s[k] = n then
23

p := p-1
else
p := k;
if p >= 1 then
begin
s[p] := s[p]+1;
for i := p+1 to k do
s[i] := s[i-1] + 1
end

{3}
end
end.

. , {1}
n1
1 + . . . + C1nk+1 1 ,
k ; {2} Ckn ; {3} Ckn 1 + Ck1
Ckn+1 k 1. , O(Ckn+1 ). ,
n+1
k
n
Ckn+1 = Ckn
Ck1

, ,
nk+1
nk+1
, k = n o(n).
(n k)-, .
. SUBSET1 k-, n- . .

3.1. k-
, , - .
6. X. m , m
, m .
. X = {a, b, c} (ab)3 = ababab ab3 = abbb.
- n- , SET2, G(n). , G(n) n {0, 1}. G(n),
k SET2, G(n, k). ,
G(n) G(n, k), GR(n) GR(n, k) .
1. G(n) k 1k 0nk ,
1k1 0nk 1 0n , k = 0.
. n, n = 1 .
i n k, ,
n + 1 k. G(n) (2) . 2.2
G(n + 1) = G(n)0; GR(n)1, k 0 (
k = n + 1) G(n) . ,
1k 0n+1k , . k 1 G(n)
c 1k1 0nk+1 1, . k = n + 1
G(n + 1), n + 1 , 1n+1 .
2. G(n, k) .
24

. n. , , n = 1, k = 0, k = 1. , n
k, 0 k n. , n+1 k, 0 k n+1. k = 0
k = n+1, , G(n+1)
. 1 k n , G(n)0 GR(n)1. , ,
k G(n)0
k GR(n)1. ,
: k = 1 0n1 10 0n 1, k > 1 1k2 10nk 10 1k2 00nk 11 .
. G(n, k), n k 0,
:
G(n, k) = G(n 1, k)0; GR(n 1, k 1)1 G(n, 0) = 0n , G(n, n) = 1n

(3)

, ,
, G(n) ,
k. (3)
G(n, k) .
program subset2;
const n = ; k= ; {0<k<=n}
var i: integer;
s: array[1..n] of 0..1;
procedure print(m, h: integer);
begin
if h <> 0 then
h := 1;
for i := 1 to m do
s[i] := h;
for i := 1 to n do
write(s[i]);
writeln
end;
procedure GR(m, h: integer); forward;
procedure G(m, h: integer);
begin
if (h = 0) or (m = h) then
print(m, h)
else
begin
s[m] := 0;
G(m-1, h);
s[m] := 1;
GR(m-1, h-1)
end
end;
procedure GR(m, h: integer);
begin
if (h=0) or (m=h) then
print(m, h)
else
begin
25

s[m] := 1;
G(m-1, h-1);
s[m] := 0;
GR(m-1, h)
end
end;
begin {SUBSET2}
G(n,k)
end.
. GR(m,h) GR(m, h). print
.

G GR.
. n = 5, k = 3.
G(5,. 3)
1

0
G(4, 3)
0

GR(4, 2)
1

G(3, 3)

GR(3, 2)

G(2, 1)
0
G(1, 1)

10110

G(3, 1)
0

1
11100

GR(2, 2)
1

GR(1, 0)

01110

G(2, 1)
0

G(1, 1)
11010

10011

GR(3, 2)

GR(2, 0)
0

GR(1, 0)

01011

1
G(2, 1)
0

G(1, 1)
00111

10101

GR(2, 2)
1

GR(1, 0)
11001

01101

, G(n, k) . , G(m 1, h) GR(m 1, h),


, s[m] .
G(m 1, h)s[m] GR(m 1, h)s[m]. , , ,
. , G(n, k)
,
. - m.

s[m], . . . , s[n]. , h ,
s[1], . . . , s[m 1].
.
1. , (m = 0) G(m, 0)1, GR(m, 0)1
G(m, m)0, GR(m, m)0, G(m, 0)0, GR(m, 0)0 G(m, m)1, GR(m, m)1.
26

2. G GR n k. (. , 1, 2, . . . , k ,
, 1, 2, . . . , n k .)
3. SUBSET2.
4. .
G(n, k). 2 G
GR.

, , , G(n, k). ,
.
. , SUBSET2,
G,
GR. , G.
m. , s[1], . . . , s[m],
h ,
s[1], . . . , s[m 1].
m , . G(m-1,h), , ,
, G(m 1, h) G, . G(m 1, h)
G (m, . . .). G (m, . . .) G, GR, G s[m] 0, GR
1. GR(m 1, . . .) G (m, . . .). ,
G(n, k),
G(n, k), . . . , G (m, . . .), GR(m 1, . . .), G(m 2, . . .), . . . , G(p, . . .),
p . .. ,
, G(n, k), . . . , G (m, . . .)
,
G (m, . . .), .
2

, , , ,
; ; ,
, .

27

G(n,. k)
G (m, . . .)
s[m 1]

1 s[m 1]

G(m 1, h)

GR(m 1, h)
1

GR(m 2, h 1)

G(m 2, . . .)

( ) ( )
,
1, . . . , m,
G m 2, . . . , p + 1.
s[m], 1
:
1. s[m] = 0, h > 1, , (m 1)
G(m 1, h),
GR(m 1, h 1), ..
1h2 10mh1 10 . . . 1h2 00mh1 11 . . .
s[m] = 0, h = 1,
0m2 10 . . . 0m2 01 . . .
2. s[m] = 1, h > 0, , (m 1)
G(m 1, h),
GR(m 1, h), .
1h1 00mh2 11 . . . 1h1 10mh2 10 . . .
s[m] = 1, h = 0,
0m2 01 . . . 0m2 10 . . .
,
s[h 1],
s[m 1],
s[h],
s[m 1],

s[m] = 0 h > 1
s[m] = 0 h = 1
s[m] = 1 h > 1
s[m] = 1 h = 0

p,
.
h = 0 h = m 1, ,
G(m1, h) , h
28

h+1. , h = 0 h = m1
m 1, m 2, . . . , h + 1, , s[m 2] = . . . = s[1] = 0;
m 1. h
, , s[m 1], s[m 2], . . . , s[h + 1] s[m 1],
h hs[m1]. h 0,
s[m 2] = . . . = s[1] = 0.
:
program subset3;
const n = ; k = ; n1 = ; n2 = ; {n1=n+1, n2=n+2}
var i, m, h: integer;
s: array[1..n1] of 0..1; { }
t: array[1..n1] of 1..n2; { }
begin
for i := 1 to k do
begin
s[i] := 1;
t[i] := i+1
end;
for i := k + 1 to n1 do
begin
s[i] := 0;
t[i] := i+1
end;
h := k;
t[1] := k+1; {t[1] }
m := 0;
while m <> n1 do
begin
for i := 1 to n do
write(s[i]);
writeln; { }
m := t[1];
t[1] := t[m];
t[m] := m+1; { }
if s[m] = 1 then
begin
if h <> 0 then
s[h] := 1-s[h]
else
s[m-1] := 1-s[m-1];
h := h+1
end
else
begin
if h <> 1 then
s[h-1] := 1-s[h-1]
else
s[m-1] := 1-s[m-1];
h := h-1
end;
s[m] := 1-s[m]; { }
if (h = m-1) or (h = 0) then
29

h := h+1
else
begin
h := h - s[m-1]; { h}
t[m-1] := t[1];
if h = 0 then
t[1] := m-1
else
t[1] := h+1 { }
end

{1}

{2}
end
end.

. , SET4. t[1]
, t[j] ,
. {1} {2}
m 1, . . . , h + 1.
.
1. SUBSET3.
2. , k = 0.

1. . . . . .: , 1993
2. . . . , . 1988.
3. . . , . 1982.
4. . , . , . . . . . . 1980.

4.
Turbo Pascal
, .
, , ( )
.
:
procedure function,
; . ,
.
.

30

type
proc1 = procedure;
{ }
proc2 = procedure (var x, y: integer);
{ - integer}
func1 = function (x: real): real;
{ real real}
:
var
p1: proc1;
p2: proc2;
f1: func1;
. ,
.
:
{$F+} far



inline interrupt.
.
{$f+}
procedure swap(var a, b: integer);
var t: integer;
begin
t := a;
a := b;
b:= t
end;
function tan(angle: real): real
begin
tan := sin(angle)/cos( angle)
{, cos( angle)<>0, }
end;
{$f-}
, , :
p2 := swap;
f1 := tan;
p2(i,j) f1(x) swap(i,j) tan(x).

31

, 4 ,
( {$f-}).
, :
( ), (
), ,
. - .
. .

s=

f (x)dx
a

fi :
sk =

h
(f0 + 4f1 + 2f2 + 4f3 + 2f4 + . . . + 4fn3 + 2fn2 + 4fn1 + fn ),
3

fi = f (a + i h), h = (b a)/n n = 2k . n + 1, h . s
s1 , s2 , . . ., , () .
. ,
f (x) 2k k- ,
fi , . sk
(1)

(2)

(4)

sk = sk + sk + sk ,
1, 2, 4.
k > 1:
1 (2)
(1)
sk = sk1
2
1 (2)
1 (4)
(2)
sk = sk1 + sk1
2
4
4h
(4)
sk =
(f (a + h) + f (a + 3h) + . . . + f (a + (n 1)h))
3
:
(1)

h
(f (a) + f (b))
3
=0
4h a + b
=
f(
)
3
2

s1 =
(2)

s1

(4)

s1

program integral;
const pi = 3.141592;
type func1 = function (x: real): real;
var ep: real;
{$f+}
32

function bil(x: real): real;


var a1, a2: real;
i:integer;
begin
a1: = sin(10*x);
a2: = sin(x);
if a2 = 0 then
a1: = 1
else
a1 := a1/a2;
bil := a1*a1*a1*a1*a1*a1;
end;
function bi(x: real):real;
begin
bi := sin(x)
end;
{$f-}
function simpson(a, b: real; f: func1): real;
var i ,n: integer;
s, ss, s1, s2, s4, h: real;
begin
n := 2;
h := (b-a)*0.5;
s1 := h*(f(a)+f(b));
s2 := 0;
s4 := 4*h*f(a+h);
s := s1 + s2 + s4;
repeat
ss := s;
n := 2*n;
h := h/2;
s1 := 0.5*s1;
s2 := 0.5*s2 + 0.25*s4;
s4 := 0;
i := 1;
repeat
s4 := s4 + f(a+i*h);
i := i+2
until i>n;
s4 := 4*h*s4;
s := s1+s2+s4
until abs(s-ss)<ep;
simpson := s/3
end; {simpson}
begin
ep := 0.001;
writeln((1/(2*pi))*simpson(0,2*pi,bil));
writeln(simpson(0,pi/2,bi))
end.

33

5.
.

(, ).
,
. ( , ,
, , ,
, ,
.)

file of T
T .
,
.
,
:
. -
.
.
().
, , .
, .
. .
program p (output, f1, f2);
type = record
: integer;
: string
end;
var f, f1, f2: file of ;
f1, f2 , f . output .
. , , ,
, , .
, (a, b). input =< a, b >, b = 0. output =< g >, g =
(a, b).
: , . ;
TEXT; , char byte
, .
DOS. . . :
34

assign(f, name: string),


f , name
, .
.
assign(f1,c:\kostin\tree.text)
, . . . ,
. , , , ,
, .
: reset(f) ;
rewrite(f) .
, .. , , , .

5.1. -.

Assign (F, Name) , Name.


Name string (
) Phar.
MS DOS, 79 .
, .
Reset(F[,Size]) . ,
F, . Size
.
128.
Rewrite(F[,Size]) . ,
, Assign. , . Size ,
Reset.
Close(F) . ,
F.
.

Eof(F) . true,
( , ),
false .
IOResult -. 0, - , .
-
0.

35

5.2.
, , .
, read write,
Char String, .
ASCIIZ-.
: input ( ) output ( ).
Text reset,
rewrite append.

Append(f) . , F, .
Read(F,< ) . ,
F,
.
ReadLn(F,< ) . ,
read, , , .
Write(F,< >) . ,
F, .
WriteLn(F,< >) . ,
write, .

Eoln(F) . true,
eof(F) true.
false.

5.3.

Read(F,< ) . , read
, , ,
, .
Write(F,< >) . , write
, ,
.
Seek(F,Num) . , F.
Num, .
Truncate(F) , .
, .

36


FilePos(F) .
, F.
.
FileSize(F) . ,
F, .
. , ()
80- (). , .
.
,
. ,
.
: input ; output
; ; b .
.
b, . b. ,
.
naid true
.
program ff1;
type rec = record
kl: integer;
ct: string[80]
end;
var r, nov: rec;
a, b: file of rec;
i: integer;
naid: boolean;
begin
with nov do
begin
readln(kl);
readln(ct)
end;
assign(a, c:\pas\pasv\f1.txt);
assign(b, c:\pas\pasv\f2.txt);
reset(a);
rewrite(b);
naid := false;
while not(naid or eof(a)) do
begin
read(a, r);
if nov.kl = r.kl then
naid:=true
else
write(b,r)
end;
37

write(b, nov);
while not eof(a) do
begin
read(a, r);
write(b, r)
end;
writeln( );
close(a);
close(b)
end.
:
program ff2;
type rec = record
kl: integer;
ct: string[80]
end;
var r: rec;
a: file of rec;
i: integer;
begin
assign(a, c:\pas\pasv\f1.txt);
rewrite(a);
for i := 1 to 5 do
with r do
begin
readln(kl);
readln(ct);
write(a, r)
end;
close(a)
end.
. (
).

6.
program ref(input, output);
type YK = ^EL;
EL = record
VAL: integer;
REF: YK
end;
var X: YK;
procedure SN1(var Z: YK);
var A: integer;
Y: YK;
begin
Z := nil;
read(A);
38

while A<>0 do
begin
new(Y);
Y^.VAL := A;
Y^.REF := Z;
Z := Y;
read (A);
end
end;
procedure S1N(var Z: YK);
var A: integer;
Y: YK;
begin
Z := nil;
read(A);
if A<>0 then
begin
new(Y);
Z := Y;
Y^.VAL := A;
read(A);
while A<>0 do
begin
new(Y^.REF);
Y := Y^.REF;
Y^.VAL := A;
read(A);
end;
Y^.REF := nil;
end
end {S1N};
procedure PS(X: YK);
begin
writeln;
while X<>nil do
begin
write(X^.VAL, );
X := X^.REF
end;
writeln
end;
procedure S1NR(var X: YK);
var A: integer;
begin
read(A);
if A<>0 then
begin
new(X);
X^.VAL := A;
S1NR(X^.REF)
end
else
39

X := nil
end;
procedure YS(var X: YK);
var A: integer;
Z, Y, U: YK;
T: boolean;
begin
read(A);
if A<>0 then
begin
new (X);
X^.REF := nil;
X^.VAL := A;
read(A)
end;
while A<>0 do
begin
new(Y);
Y^.VAL := A;
if X^.VAL>A then
begin
Y^.REF := X;
X := Y
end
else
begin
Z := X;
U := Z;
T := true;
while (Z<>nil) and T do
begin
T := Z^.VAL<A;
U := Z;
Z := Z^.REF
end;
Y^.REF := Z;
U^.REF := Y;
end;
read(A)
end
end;
begin {MAIN PROGRAM}
YS(X);
PS(X);
{ S1NR(X);
PS(X)}
end.

7. ()
: 2 6 4 3 7 -2 8 5, :

40

2.

-2

:
, , , .
,
.
pd, . , , ,
.
program dersort;
type
ref = ^yz;
yz = record
i: integer;
l, r: ref
end;
var x: ref;
procedure pd(var x: ref);
var z, y, y1: ref;
a: integer;
begin
read(a);
if a<>0 then
begin
new(x);
x^.i := a;
x^.l := nil;
x^.r := nil;
read(a);
while a<>0 do
begin
y:=x;
new(z);
z^.i := a;
z^.l := nil;
z^.r := nil;
while y<>nil do
begin
y1 := y;
if a < y^.i then
y := y^.l
else
41

y :=
end;
if a < y1^.i
y1^.l :=
else
y1^.r :=
read(a)

y^.r
then
z
z;

end
end
end;
procedure cod(var x: ref);
begin
if x<>nil then
begin
cod(x^.l);
write(x^.i:3);
cod(x^.r)
end
end;
begin
pd(x);
cod(x)
end.
:
.
.
, :
, , ,
O(log2 n), n , O(n). , ,
.
.
, . .

.
Tn , .
. Tn , ,

.
. n = 3, : 1 2 3, :

42

123

312
.3

132

1.

.1

213
.2

2.

231
.2

1
3

1
3
.
1

.1

.1
.1

.1

.1

2
2

321
.3

i- Tn m(i, n),
, i- , q(i, n).
m(i, n) q(i, n).
i- , i > 1, , (i 1)- , (i 1)-
,
m(i, n) = 2 m(i 1, n) q(i 1, n), i > 1
, m(i, n) = 0, i > n.
, Tn
Tn+1 . Tn n + 1 Tn+1
n + 1 . i i-
, , n + 1
i- ,
i 1, ..
m(i, n + 1) = (n + 1) m(i, n) + q(i 1, n), i > 1
,
m(i, n + 1) = n m(i 1, n) + 2m(i 1, n), i > 1
Tn :
m(1, n) = n!

. , i- ,
i .
t Tn , t , t i-
mt (i), i = 1, . . . , n. , t

t
k =
i mt (i)
i=1

43

n! n- ,
Tn .
n
n
1 t
1 1
1 t
t
K(n) =
k =
i m (i) =
(i
m (i))
n! tT
n! tT n i=0
n n! i=1
tT

, ,

tTn

mt (i) = m(i, n),


1
i m(i, n)
n n! i=1
n

K(n) =

m(i, n), k(n)


(n 1) (n + 1)
2n 1
K(n) =
k(n 1) +
,
2
n
n2
( )
2(n + 1) 1
K(n) =
3, n 1
n
n
i=1
n

ni=1 n1 = ln n + O(1), .. K(n) = 2 ln n + O(1) = 2 ln 2 log2 n + O(1). 2 ln 2


1.39,
40%.
.
t, , i, i 1 . , ,
t

p =

(i 1)m (i) =
t

i=1

i m (i)
t

i=1

mt (i)

i=1

n k t , n t,

pt = n k t n
Tn , p(t) , :
1 t
n t
p(t) =
p =
k n = n k(n) n
n! tT
n! tT
n

k(n),
p(n) = 2(n + 1)

1
i=1

4n

n
p(n) = 2n ln n + O(n) = 2 n ln 2 log2 n + O(n)

, .
. , .
1
d(n) =
(i k(n))2 m(i, n)
n n!
44

8.
7. .
.
.
: , , , ; .
, , . ,
n 1, . . . , n.
, , ..
.
. n = 3.
1.
2

3 (, 1897). n nn2 .
(, 1917). n , 1, . . . , n. i1 , . . . , in2 ,
:
1. j = 0
2. n 2 :
j ; ,
. kj , kj , ij . ij j-
. (ij , kj ).
,
: (in2 , n), , in2 = n, (n, n 1).
.
.4
4.

.
8

, , .
i1 , . . . , in2 .
1. . ,
(in2 , n), in2 = n, (n, n 1), in2 = n.
2.
45

(a) j = n 2.
(b) n 2
ij1 ( j = 1) ,
(ij , ij1 ); (ij , m), m
, .
. , .
. i1 , . . . , in2 ,
1..n. , , , .
, .
. . ,
, n 2 , n .
. , , . . , ,
, , .
.
,
:
program pruff;
const n = 7;
type v = ^t;
t = record
i: 1..n;
r: v
end;
pru = array[0..n-2] of integer; { , n}
var k, i, j, a: integer; {n-1 }
sp: array[1..n] of v;
x, y: v;
:
procedure inpruff(var pr: pru); { }
var rab: boolean;
begin
for j := 1 to n-2 do
begin
k:=1;
repeat
rab := false;
if sp[k] = nil then
k := k+1
else
46

if sp[k]^.r <> nil then


k := k+1
else
rab := true
until rab;
a : =sp[k]^.i;
pr[j] := a;
sp[k] := nil;
x := sp[a];
while (x^.i<>k) do begin
y := x;
x := x^.r
end;
if sp[a] = x then
sp[a] := x^.r
else
y^.r := x^.r
end;
end; {inpruff}
:
procedure outpruff; { }
procedure bk(var a, b: integer); { a, b }
begin
new(x);
new(y);
x^.i := a;
x^.r := sp[b];
sp[b] := x;
y^.i := b;
y^.r := sp[a];
sp[a] := y
end; {bk}
begin {outpruff}
for i := 1 to n do
sp[i] := nil;
pr[0] := n;
a := pr[n-2];
if a = n then
i := n-1
else
i := n;
bk(a, i);
for j := n-2 downto 1 do
{1}
if sp[pr[j-1]] = nil then
bk(pr[j-1], pr[j])
else
begin
while sp[i] <> nil do
i := i - 1;
bk(i, pr[j])
47

end
end; {outpruff}
. pru , j = 1, {1}. pr, outpruff ,
n.
. . , W =
n=1 Wn , Wn . , -
W Wn f (n) . f (n) ,
f (n)
limn
= 1, h(n) = log2 |Wn |.
h(n)
h(n) n
h(n) = (n2)log2 n. ,
f (n)
f (n) = (n 2) log2 n , limn
= 1.
h(n)
f (n)
limn

h(n)
f (n)
, limn
= 2 .
h(n)
.. . . . 1985.

9.
program transport;
uses CRT; {1 2 3 }
const n = 8; mr = 1.0E10;
type yk = ^el;
el = record
nom: integer;
r: real;
tp: 1..3;
next: yk
end;
var sp: array[1..n] of record
b: real;
ref: yk
end;
f: Text;
i, j: integer;
a: real;
x, y: yk;
t: 1..3;
procedure WWOD;
begin
assign(f, gro.txt);
reset(f);
while not EOF(f) do
begin
read(f, i);
48

sp[i].b := mr;
if eoln(f) then
sp[i].ref := NIL
else
begin
write(i);
read(f, j, a, t);
new(x);
x^.nom := j;
x^.tp := t;
x^.r := a;
x^.next := nil;
sp[i].ref := x;
while not eoln(f) do
begin
read(f, j, a, t);
new(y);
y^.nom := j;
y^.r: = a;
y^.tp := t;
y^.next := nil;
x^.next := y;
x := y
end
end
end
end;
procedure VYVOD;
var p: integer;
begin
writeln;
for p := 1 to n do
begin
write(p:3, , sp[p].b:9:1, );
x := sp[p].ref;
while x <> nil do
begin
write(x^.nom:2, x^.r:5:1, x^.tp:2, );
x := x^.next
end;
writeln;
end;
end;
procedure WAVE (i: integer; rr: real); { }
var pp, k: integer;
p: array[1..n] of integer;
begin
x := sp[i].ref;
pp := 0;
while x <> nil do
begin
k := x^.nom;
49

a := rr + x^.r;
if ((x^.tp = 1) or (x^.tp = 3)) and (sp[k].b > a) then
begin
pp := pp + 1;
sp[k].b := a;
p[pp] := k
end;
x := x^.next
end;
for k := 1 to pp do
WAVE(p[k], sp[p[k]].b)
end;
{procedure WAVE (i: integer; rr: real); { }
var x: yk;
begin
x := sp[i].ref;
while x <> nil do begin
k := x^.nom;
a := rr + x^.r;
if ((x^.tp = 1) or (x^.tp = 3)) and (sp[k].b > a) then
begin
sp[k].b := a;
WAVE(k,a)
end;
x := x^.next
end;
end;}
procedure REVERSE (j: integer);
var a: real;
k: integer;
begin
if j <> i then
begin
x := sp[j].ref;
k := j;
a := sp[j].b;
while x <> nil do
begin
if (x^.tp > 1) and (sp[x^.nom].b < a) then
begin
k := x^.nom;
a := sp[x^.nom].b
end;
x := x^.next;
end;
REVERSE(k);
write(-->, j)
end
else
write(j)
end;
begin
50

ClrScr;
WWOD;
VYVOD;
Writeln( );
read(i, j);
sp[i].b := 0;
WAVE(i,0);
VYVOD;
if sp[j].b >= mr then
writeln( )
else
REVERSE(j)
end.

51

Вам также может понравиться