Tải bản đầy đủ (.pdf) (8 trang)

Tài liệu Đề thi toán quốc tế tháng 5-6 2001 ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.16 MB, 8 trang )

5-2001

Mã hóa kép



BÀI TOÁN


AES đang nghiên cứu một thuật toán mã hóa rất mạnh. Thuật toán làm việc với 3
khối
, mỗi khối
gồm 128 bit. Cho trước khối văn bản
p
và một khối chốt
k
, hàm mã hóa AES
E
sẽ khôi phục lại
khối đã được mã hóa
c
:




c
=
E
(
p


,
k
) .



Nghịch đảo của hàm mã hóa
E
là hàm giải mã
D


như sau:




D
(
E
(
p
,
k
),
k
) =
p
,
E

(
D
(
c
,
k
),
k
) =
c
.



Trong hàm mã hóa
AES kép
, hai khối chốt khác nhau
k
1

k
2
được dùng liên tục nhau theo thứ tự
k
1
,
k
2
:





c
2
=
E
(
E
(
p
,
k
1
),
k
2
).



Trong bài toán này, cho trước cả số nguyên
s
. Chỉ xét 4*
s
bit ở tận cùng bên trái của một trong số
chuỗi, còn lại các bít khác (128 bit tận cùng bên phải trừ đi các bit 4*
s
) đều là 0.




Hãy khôi phục cặp khối chốt của một số đoạn văn bản được AES mã hóa hai lần. Cho trước đoạn
văn bản chưa mã hóa
p
và đoạn văn bản đã mã hóa hai lần tương ứng
c
2
, và cấu trúc của khối mã
hóa được biểu diễn bằng
s
.



Thuật toán mã hóa và giải mã AES có sẵn trong thư viện

.

Bạn phải đưa ra khối khôi phục thay vì chương trình khôi phục.





INPUT



Cho trướs 10 bộ dữ liệu trong các tệp văn bản có tên từ

double1.in
đến
double10.in
.
Một tệp input chứa 3 dòng. Dòng đầu tiên chứa số nguyên
s
, dòng thứ hai chứa văn bản chưa mã
hóa
p
, dòng dòng thứ ba chứa văn bản đã mã hóa hai lần
c
2
từ
p
bằng thuật toán AES kép. Cả hai
khối đều là các chuỗi gồm 32 ký tự theo hệ thập luc phân ('0' '9', 'A' 'F').





OUTPUT



Hãy đưa ra 10 tệp output tương ứng với 10 tệp input. Mỗi tệp output cũng gồm 3 dòng. Dòng thứ
nhất chứa
#FILE double I
trong đó
I

là số thứ tự tệp input. Dòng thứ hai chứa khối chốt
k
1
, và dòng thứ ba chứa khối chốt
k
2
, sao cho




c
2
=
E
(
E
(
p
,
k
1
),
k
2
).



C


hai
kh

i
đ

u
l
à
chu

i
g

m
32
k
ý
t

theo
h

th

p
l

c

ph
â
n
('0' '9' 'A' 'F')
N
ế
u
c
ó
nhi

u
gi

i
Page 1
6-2000

6. Building with Blocks


Bài toán



Hình lập phương đơn vị là hình có kích thước 1x1x1 với các góc có tọa độ nguyên
x
,
y


z
. Hai
hình lập phương đơn vị liên thông với nhau khi chúng có chung 1 mặt. Một vật thể rắn ba chiều
(gọi tắt là vật rắn) là một nhóm các hình lập phương đơn vị liên thông không rỗng như trong hình
1. Thể tích của vật rắn là số hình lập phương đơn vị nằm trong vật rắn. Một khối là một vật rắn có
thể tích lớn nhất là 4. Hai khối có được gọi là đồng dạng nếu quay hoặc tịnh tiến một khối sẽ được
khối còn lại. Có tất cả 12 kiểu khối (xem hình 2). Màu sắc trong hình 2 chỉ giúp phân loại cấu trúc
vật rắn.



Một bộ D các khối là thành phần của vật rắn S khi kết hợp tất cả các khối trong D sẽ được S, và
hai khối khác nhau trong D không có chung một hình lập phương đơn vị.



Hãy viết chương trình từ một mô tả các kiểu khối và vật rắn S, xác định bộ khối nhỏ nhất có thể
cấu thành S. Chỉ cần báo cáo kiểu của các khối trong cấu thành.



Input



Trong input, hình lập phương đơn vị được mô tả bằng một dòng với ba số nguyên
x
,
y


z
, là cặp
tọa độ của góc với
x
+
y
+
z
nhỏ nhất.



Tệp input mô tả kiểu khối có tên là
TYPES.IN
gồm phần mô tả 12 kiểu khối trong hình 2 sắp
xếp theo tên kiểu. Mỗi kiểu khối được mô tả bằng một nhóm dòng liên tục. Dòng đầu tiên chứa số
nguyên
I
chỉ kiểu khối (1 <=
I
<= 12). Dòng thứ hai chứa thể tích
V
của kiểu khối đó (1 <=
V
<=
4). V dòng còn lại, mỗi dòng chứa ba số nguyên
x
,
y


z
, mỗi số nguyên là số hình lập phương
đơn vị trong kiểu khối (1 <=
x
,
y
,
z
<= 4).



Tệp input mô tả vật rắn có tên là
BLOCK.IN
. Dòng đầu tiên chứa thể tích
V
của vật rắn (1 <=
V

<= 50).
V
dòng còn lại mỗi dòng chứa ba số nguyên
x
,
y
,
z
, mỗi số là số hình lập phương đơn vị
cấu thành vật rắn (1 <=
x

,
y
,
z
<= 7).



Output



Tệp output có tên
BLOCK.OUT
. Dòng đầu tiên chứa một số nguyên
M
là số khối ít nhất cấu
thành vật rắn. Dòng thứ hai liệt kê
M
tên kiểu khối cấu thành vật rắn. Với mỗi tệp input có thể có
nhiều giải pháp, chương trình của bạn chỉ cần báo cáo một giải pháp.


V
í dụ



Input và Output


TYPES.IN

1

1

1 1 1

2

2

1 1 1

1 2 1

3

3

Page 1
3
1 1 1

1 2 1

1 3 1

4


3

1 1 1

1 2 1

1 1 2

5

4

1 1 1

1 2 1

1 3 1

1 4 1

6

4

1 1 1

1 2 1

1 1 2


1 2 2

7

4

1 1 1

1 2 1

1 1 2

1 1 3

8

4

1 1 1

1 2 1

1 3 1

1 2 2

9

4


1 2 1

1 3 1

1 1 2

1 2 2

10

4

2 1 1

1 2 1

2 2 1

2 1 2

11

4

1 1 1

1 2 1

2 2 1


1 1 2

12

4

2 2 1

2 1 2

1 2 2

2 2 2

BLOCK.IN

18

2 1 1

4 1 1

2 3 1

4 3 1

2 1 2

3 1 2


4 1 2

1 2 2

2 2 2

3 2 2

4 2 2

Page 2
3
2 3 2

3 3 2

4 3 2

4 2 3

4 2 4

4 2 5

5 2 5

BLOCK.OUT


5


7 10 2 10 12



Chú ý:


1. Tệp input có tên
BLOCK.IN
mô tả vật rắn có tên ‘con ngựa’ trong hình 1.

2. Các giải pháp khác cho dòng thứ hai của output mô tả các kiểu khối được sử dụng, như sau:

2 7 10 11 12

2 7 11 11 12

4 4 7 10 11

4 4 9 10 11


Page 3
3


Page 4
6-2001


Kho hàng



Bài toán



Một công ty công nghệ cao có một kho hàng lớn hình chữ nhật. Kho hàng có một người quản lý
và một công nhân vận hành. Các cạnh của kho hàng theo thứ tự được gọi là cạnh trái, trên, phải
và dưới. Diện tích kho hàng được chia thành các ô vuông bằng nhau theo các hàng và các cột.
Các hàng được đánh số từ đỉnh bằng các số nguyên 1,2, , và các cột được đánh số bắt đầu từ bên
trái bắt đầu từ 1,2,



Kho hàng có các container dùng để chứa các thiết bị kỹ thuật có giá trị không cao. Mỗi container
cũng được đánh số khác nhau. Mỗi container nằm gọn trong một ô vuông sàn kho. Kho hàng đủ
lớn để số container được đưa đến luôn nhỏ hơn số ô vuông sàn kho. Các container không được
đưa ra khỏi kho hàng mà chỉ có các container mới được đưa đến. Cửa vào kho hàng ở góc trên
bên trái.



Người công nhân xếp các container quanh cửa kho sao cho anh ta có thể tìm chúng theo số đánh.
Anh ta dùng cách sau.



Giả sử, container tiếp theo được đưa vào có số hiệu là

k
. Người công nhân đi dọc theo hàng thứ
nhất từ bên trái để tìm container có số nhỏ hơn
k
. Nếu không tìm thấy container đó, thì container
k

sẽ được xếp ngay vào sau container cuối cùng trong hàng thứ nhất. Nếu tìm thấy container
l
nhỏ
hơn
k
thì
l
sẽ được thay bằng
k

l
được đưa vào hàng tiếp theo. Nếu người công nhân đi đến
hàng không chứa container nào, thì
k
sẽ được đưa vào vị trí đầu tiên bên trái của hàng đó.



Giả sử các container
3,4,9,2,5,1
được đưa đến kho theo thứ tự này thì chúng sẽ được xếp
như sau.


1 4 5

2 9

3



Người quản lý đến chỗ người công nhân và nói với anh ta như sau:



Người quản lý
: Container 5 có đến trước container 4 không?

Người công nhân
: Không thể có điều đó.

Người quản lý
: Vậy thì thứ tự đưa container đến theo vị trí xếp như thế nào?

Người công nhân
: Ví dụ, các container có thể đưa đến kho theo thứ tự
3,2,1,4,9,5
hoặc
3,2,1,9,4,5
hoặc theo một trong 14 thứ tự khác.




Hãy giúp người quản lý viết chương trình từ cách sắp xếp container cho trước, hãy tính các thứ tự
đưa container đến kho.















INPUT

Page 1
Depot


Tệp input có tên là
depot.in
. Dòng đầu tiên chứa một số nguyên
R
: chỉ số hàng có container.
R


dòng sau đó chứa thông tin về các hàng 1, ,
R
bắt đầu từ trên đỉnh. Dòng đầu tiên trong số các
dòng đó chứa số
M
chỉ số container trong hàng đó. Sau đó đến
M
số nguyên chỉ số đánh trên
container bắt đầu từ bên trái hàng. Số đánh trên container
I
thỏa mãn 1


I


50.
N
là số container
trong kho hàng với 1 <=
N
<= 13.





OUTPUT




Tệp output có tên là
depot.out
. Tệp output chứa số dòng tướng ứng với số khả năng đưa hàng
đến kho. Mỗi dòng trong số đó chứa
N
số nguyên chỉ số đánh trên container theo thứ tự đưa đến
kho được mô tả trên dòng đó.



Ví dụ

INPUTS và OUTPUTS


Ví dụ 1:


Ví dụ 2:



Page 2
Double
C


hai


kh

i

đ

u

l
à

chu

i
g

m

32

k
ý

t

theo
h

th


p
l

c
ph
â
n
(0

9
,
A

F)
.
N
ế
u

c
ó

nhi

u
gi

i
pháp hãy in ra một giải pháp.



Ví dụ



Thư viện


Thư viện FreePascal (Linux:
aeslibp.p, aeslibp.ppu, aeslibp.o;
Windows:
aeslibp.p,
aeslibp.ppw, aeslibp.ow*
):





type

HexStr = String [ 32 ]; { only '0' '9', 'A' 'F' }

Block = array [ 0 15 ] of Byte; { 128 bits }



procedure HexStrToBlock ( const hs: HexStr; var b: Block );

procedure BlockToHexStr ( const b: Block; var hs: HexStr );


procedure Encrypt ( const p, k: Block; var c: Block );

{ c = E(p,k) }

procedure Decrypt ( const c, k: Block; var p: Block );

{ p = D(c,k) }



Cho trước chương trình
aestoolp.pas
minh họa cách dùng thư viện FreePascal.



thư viện GNU C/C++ (Linux và Windows:
aeslibc.h, aeslibc.o*
):



typedef char HexStr[33]; /* '0' '9', 'A' 'F', '\0'-terminated */

typedef unsigned char Block[16]; /* 128 bits */



void hexstr2block ( const HexStr hs, / * out-param */ Block b );


void block2hexstr ( const Block b, / * out-param */ HexStr hs );

void encrypt ( const Block p, const Block k, / * out-param */ Block c );

/* c = E(p,k) */

void decrypt ( const Block c, const Block k, / * out-param */ Block p );

/* p = D(c,k) */



Chương trình
aestoolc.c
minh họa cách dùng thư viện GNU C/C++.


Ràng buộc


Số
s
các chữ số theo hệ thập lục phân 1 <=
s
<=
5.




Gợi ý:
Một chương tình tốt có thể khôi phục một trong số khối chốt yêu cầu trong chưa đến 10
giây với bất kỳ input nào.


Page 2

×