Dòng thứ nhất chứa #FILE double I trong đó I là số thứ tự tệp input... 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
Trang 1Mã 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 và 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 )
Trang 26 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 và 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 và 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 và 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
Trang 31 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
Trang 42 3 2
3 3 2
4 3 2
4 2 3
4 2 4
4 2 5
5 2 5
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
Trang 53
Trang 6Kho 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 và 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
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
Trang 7
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:
Trang 8Cả 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