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

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

Đang tải... (xem toàn văn)

Thông tin tài liệu

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 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 ). 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 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 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 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 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 . 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 ,. 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'

Ngày đăng: 26/01/2014, 03:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan