Google Code Jam 2016 - Qualification Round

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2016 - Coin Jam 30 1.0s 1G
2 Google Code Jam 2016 - Counting Sheep 15 1.0s 1G
3 Google Code Jam 2016 - Fractiles 35 1.0s 1G
4 Google Code Jam 2016 - Revenge of the Pancakes 20 1.0s 1G

1. Google Code Jam 2016 - Coin Jam

Điểm: 30 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Một jamcoin là một chuỗi gồm \(N\ge2\) chữ số, có các tính chất sau:

  • Mọi chữ số là 0 hoặc 1.
  • Chữ số đầu là 1 và chữ số cuối là 1.
  • Nếu diễn giải chuỗi trong bất kỳ cơ số nào từ 2 đến 10, kể cả hai đầu, số nhận được không phải số nguyên tố.

Không phải mọi chuỗi 01 đều là jamcoin. Ví dụ, 101 không phải jamcoin vì trong cơ số 2 nó có giá trị 5, là số nguyên tố. Nhưng 1001 là một jamcoin: khi diễn giải lần lượt trong các cơ số từ 2 đến 10, nó có giá trị 9, 28, 65, 126, 217, 344, 513, 730 và 1001; không số nào là nguyên tố.

Chúng tôi nghe nói có những cộng đồng dùng jamcoin làm tiền tệ. Khi gửi jamcoin cho ai đó, phép lịch sự là chứng minh jamcoin hợp lệ bằng cách kèm một ước không tầm thường của giá trị jamcoin trong mỗi cơ số từ 2 đến 10. Ước không tầm thường của số nguyên dương \(K\) là số nguyên dương khác 1 và \(K\), đồng thời chia hết \(K\). Để thuận tiện, các ước phải được viết trong cơ số 10.

Ví dụ, với jamcoin 1001 ở trên, một bộ ước không tầm thường khả dĩ cho các giá trị trong cơ số 2 đến 10 lần lượt là 3, 7, 5, 6, 31, 8, 27, 5 và 77.

Bạn có thể tạo \(J\) jamcoin khác nhau có độ dài \(N\), cùng chứng minh chúng hợp lệ không?

Dữ liệu vào

Dòng đầu chứa số bộ test \(T\). Mỗi bộ test gồm một dòng chứa hai số nguyên \(N,J\).

Dữ liệu ra

Với mỗi bộ test, in \(J+1\) dòng. Dòng đầu chỉ gồm Case #x:, trong đó x là số thứ tự bộ test (bắt đầu từ 1). Mỗi dòng trong \(J\) dòng còn lại gồm một jamcoin độ dài \(N\), theo sau bởi chín số nguyên. Số thứ \(i\) trong chín số đó (đếm từ 1) phải là một ước không tầm thường của jamcoin khi nó được diễn giải trong cơ số \(i+1\).

Mọi jamcoin phải khác nhau. Không được in cùng một jamcoin trên hai dòng khác nhau, kể cả khi dùng bộ ước khác.

Ràng buộc

  • \(T=1\) (chỉ có một bộ test).
  • Bảo đảm tồn tại ít nhất \(J\) jamcoin khác nhau độ dài \(N\).

Phân nhóm

  • Test Set 1 (Hiển thị): \(N=16\), \(J=50\).
  • Test Set 2 (Ẩn): \(N=32\), \(J=500\).

Khác thường so với một bài Code Jam, bạn đã biết chính xác nội dung từng tệp đầu vào. Chẳng hạn, tệp đầu vào của Test Set nhỏ luôn gồm đúng hai dòng:

1
16 50

Vì vậy, bạn có thể thực hiện một số tính toán trước khi thực sự tải tệp đầu vào và bắt đầu tính giờ.

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 10/30 33,33%
Test Set 2 20/30 66,67%

Ví dụ

Ví dụ 1

Input
1
6 3
Output
Case #1:
100011 5 13 147 31 43 1121 73 77 629
111111 21 26 105 1302 217 1032 513 13286 10101
111001 3 88 5 1938 7 208 3 20 11
Giải thích

Trong ví dụ này, \(N,J\) rất nhỏ để dễ giải thích. Bộ test mẫu không xuất hiện trong Test Set nhỏ hay lớn.

Đây chỉ là một trong nhiều lời giải hợp lệ. Có thể dùng các bộ jamcoin khác và nhiều bộ ước thập phân không tầm thường khác.

  • Không thể in 110111, vì chẳng hạn trong cơ số 3 nó bằng 337 (\(1\times243+1\times81+0\times27+1\times9+1\times3+1\times1\)), là số nguyên tố.
  • Không thể in 01010110101 là jamcoin, vì jamcoin phải bắt đầu bằng 1.
  • Không thể in 101010 vì jamcoin phải kết thúc bằng 1.
  • 110011 cũng là jamcoin và có thể được dùng, nhưng không thể thêm vào cuối đầu ra mẫu này vì phải in đúng \(J\) ví dụ.
  • Với jamcoin đầu tiên trong đầu ra mẫu, số đầu tiên sau 100011 không thể là 1 hay 35 vì đó là các ước tầm thường của 35 (100011 trong cơ số 2).

Nguồn

Google Code Jam 2016, Vòng loại, bài Coin Jam.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

2. Google Code Jam 2016 - Counting Sheep

Điểm: 15 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Cô cừu Bleatrix Trotter nghĩ ra một chiến lược giúp mình ngủ nhanh hơn. Trước tiên, cô chọn một số \(N\). Sau đó cô bắt đầu đọc \(N,2\times N,3\times N,\ldots\). Mỗi lần đọc một số, cô nghĩ đến tất cả chữ số trong số đó. Cô theo dõi những chữ số trong 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 đã từng nhìn thấy ít nhất một lần trong bất kỳ số nào đã đọc. Ngay khi đã thấy đủ cả mười chữ số, cô sẽ ngủ thiếp đi.

Bleatrix phải bắt đầu bằng \(N\) và luôn phải đọc \((i+1)\times N\) ngay sau \(i\times N\). Ví dụ, giả sử cô chọn \(N=1692\), cô sẽ đếm như sau:

  • \(N=1692\). Lúc này cô đã thấy các chữ số 1, 2, 6 và 9.
  • \(2N=3384\). Lúc này cô đã thấy 1, 2, 3, 4, 6, 8 và 9.
  • \(3N=5076\). Lúc này cô đã thấy đủ mười chữ số và ngủ thiếp đi.

Số cuối cùng cô đọc trước khi ngủ là gì? Nếu cô sẽ đếm mãi mãi, hãy in INSOMNIA.

Dữ liệu vào

Dòng đầu chứa số bộ test \(T\). Mỗi bộ test gồm một dòng chứa số nguyên \(N\) mà Bleatrix đã chọn.

Dữ liệu ra

Với mỗi bộ test, in một dòng Case #x: y, trong đó x là số thứ tự bộ test (bắt đầu từ 1), còn y là số cuối cùng Bleatrix đọc trước khi ngủ theo các quy tắc trên.

Ràng buộc

  • \(1\le T\le100\).

Phân nhóm

  • Test Set 1 (Hiển thị): \(0\le N\le200\).
  • Test Set 2 (Ẩn): \(0\le N\le10^6\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 7/15 46,67%
Test Set 2 8/15 53,33%

Ví dụ

Ví dụ 1

Input
5
0
1
2
11
1692
Output
Case #1: INSOMNIA
Case #2: 10
Case #3: 90
Case #4: 110
Case #5: 5076
Giải thích

Trong bộ test 1, vì \(2\times0=0\), \(3\times0=0\), v.v., Bleatrix không bao giờ thấy chữ số nào ngoài 0; cô sẽ đếm mãi và không bao giờ ngủ. Tội nghiệp cô cừu!

Trong bộ test 2, Bleatrix đọc 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Chữ số 0 là chữ số cuối cùng còn thiếu, nên cô ngủ sau số 10.

Trong bộ test 3, Bleatrix đọc 2, 4, 6, ... Cô không thấy chữ số 9 trong số nào cho đến 90, rồi ngủ. Trước đó cô đã thấy 0, 1, 2, 3, 4, 5, 6, 7, 8; chúng xuất hiện lần đầu tương ứng trong 10, 10, 2, 30, 4, 50, 6, 70 và 8.

Trong bộ test 4, Bleatrix đọc 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 rồi ngủ.

Bộ test 5 chính là ví dụ trong đề. Nó chỉ xuất hiện trong Test Set lớn, không xuất hiện trong Test Set nhỏ.

Nguồn

Google Code Jam 2016, Vòng loại, bài Counting Sheep.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

3. Google Code Jam 2016 - Fractiles

Điểm: 35 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Ngày xưa, nền văn minh Fractal đã tạo ra những tác phẩm nghệ thuật gồm một hàng gạch. Họ dùng hai loại gạch: vàng (G) và chì (L).

Mỗi tác phẩm Fractal được xác định bởi hai tham số: một chuỗi gốc gồm \(K\) viên gạch và một độ phức tạp \(C\). Với một chuỗi gốc cho trước, tác phẩm ở độ phức tạp 1 chính là chuỗi gốc. Tác phẩm ở độ phức tạp \(X+1\) được tạo từ tác phẩm ở độ phức tạp \(X\) như sau:

  • thay mỗi viên L bằng một bản sao của chuỗi gốc;
  • thay mỗi viên G bằng \(K\) viên G.

Ví dụ, với chuỗi gốc LGL, các tác phẩm có độ phức tạp từ 1 đến 3 là:

  • \(C=1\): LGL (chính là chuỗi gốc);
  • \(C=2\): LGLGGGLGL;
  • \(C=3\): LGLGGGLGLGGGGGGGGGLGLGGGLGL.

Hình dưới minh họa cách tạo tác phẩm độ phức tạp 2 từ tác phẩm độ phức tạp 1:

https://cdn.lqdoj.edu.vn/media/pagedown-uploads/pd_1_bf2e7cbb.png

Bạn vừa phát hiện một tác phẩm Fractal, nhưng gạch quá bẩn nên không thể biết chúng làm bằng gì. Là một nhà khảo cổ am hiểu văn hóa Fractal địa phương, bạn biết \(K\)\(C\) nhưng không biết chuỗi gốc. Vì vàng rất thú vị, bạn muốn biết tác phẩm có ít nhất một viên G hay không. Ngân sách cho phép thuê \(S\) nghiên cứu sinh; mỗi người có thể lau một viên do bạn chọn trong số \(K^C\) viên để xem đó là G hay L.

Bạn có thể chọn trước không quá \(S\) vị trí sao cho, bất kể chuỗi gốc là gì, kết quả quan sát luôn cho phép kết luận chắc chắn tác phẩm có ít nhất một G hay không không? Nếu có, hãy cho biết cần lau những vị trí nào.

Dữ liệu vào

Dòng đầu chứa số bộ test \(T\). Mỗi bộ test gồm một dòng chứa ba số nguyên \(K\), \(C\)\(S\).

Dữ liệu ra

Với mỗi bộ test, in Case #x: y, trong đó \(x\) là số thứ tự bộ test (bắt đầu từ 1), còn \(y\)IMPOSSIBLE nếu không tồn tại tập vị trí thỏa mãn, hoặc là danh sách từ 1 đến \(S\) số nguyên dương chỉ các vị trí đủ để trả lời câu hỏi. Các vị trí được đánh số từ 1 ở ngoài cùng bên trái đến \(K^C\) ở ngoài cùng bên phải. Có thể in theo thứ tự bất kỳ, nhưng các vị trí phải đôi một khác nhau.

Nếu có nhiều tập hợp hợp lệ, có thể in bất kỳ tập nào. Hãy nhớ rằng sau khi nộp một bộ Small và được chấp nhận, bạn không thể tải rồi nộp một đầu vào Small khác; FAQ của cuộc thi giải thích kỹ hơn. Lời nhắc này không xuất hiện ở các vòng sau.

Ràng buộc

  • \(1\le T\le100\).
  • \(1\le K\le100\).
  • \(1\le C\le100\).
  • \(K^C\le10^{18}\).

Phân nhóm

  • Test Set 1 (Visible): \(S=K\).
  • Test Set 2 (Hidden): \(1\le S\le K\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 10/35 28,57%
Test Set 2 25/35 71,43%

Ví dụ

Ví dụ 1

Input
5
2 3 2
1 1 1
2 1 1
2 1 2
3 2 3
Output
Case #1: 2
Case #2: 1
Case #3: IMPOSSIBLE
Case #4: 1 2
Case #5: 2 6
Giải thích

Một số trường hợp mẫu còn có những đáp án hợp lệ khác.

Ở trường hợp #1, bốn chuỗi gốc GG, GL, LG, LL lần lượt tạo ra GGGGGGGG, GGGGGGGL, LGGGGGGG, LLLLLLLL. Chỉ xem ô 2 là hợp lệ: nếu nó là G, tác phẩm chắc chắn có G (không cần phân biệt ba chuỗi gốc đầu); nếu là L, chuỗi gốc buộc phải là LL, nên tác phẩm không có G.

Ngược lại, chỉ xem ô 1 không hợp lệ. Nếu thấy L, chuỗi gốc vẫn có thể là LG hoặc LL; trường hợp đầu có G, trường hợp sau thì không. 1 2 cũng hợp lệ vì riêng ô 2 đã đủ thông tin, còn 1 2 3 không hợp lệ vì dùng quá nhiều ô.

Ở trường hợp #2, tác phẩm chỉ có đúng một viên G hoặc L; nhìn viên đó hiển nhiên cho biết có G hay không.

Trường hợp #3 không xuất hiện trong Small. Tác phẩm là một trong GG, GL, LG, LL, nhưng chỉ được xem một ô. Thấy L ở ô 1 không phân biệt được LG với LL; thấy L ở ô 2 không phân biệt được GL với LL, nên không ô đơn lẻ nào đủ. Trường hợp #4 tương tự nhưng được xem thêm một ô, vì vậy có thể xem toàn bộ tác phẩm.

Ở trường hợp #5, tám chuỗi gốc GGG, GGL, GLG, GLL, LGG, LGL, LLG, LLL lần lượt tạo ra GGGGGGGGG, GGGGGGGGL, GGGGLGGGG, GGGGLLGLL, LGGGGGGGG, LGLGGGLGL, LLGLLGGGG, LLLLLLLLL. Xem ô 2 và 6 là một đáp án: nếu cả hai đều là L thì tác phẩm phải toàn L; nếu không thì có ít nhất một G. 1 2 không hợp lệ vì hai ô đó cùng là L vẫn chưa loại được chuỗi LLG. 6 2 hợp lệ vì thứ tự in không quan trọng.

Nguồn

Google Code Jam 2016, Vòng loại, bài Fractiles.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

4. Google Code Jam 2016 - Revenge of the Pancakes

Điểm: 20 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Nhà Bánh Kẹp Vô Hạn vừa giới thiệu một loại bánh mới! Một mặt bánh có khuôn mặt vui vẻ bằng vụn sô-cô-la (“mặt vui”), mặt kia không có gì (“mặt trống”).

Bạn là trưởng phục vụ đang trực và nhà bếp vừa đưa một chồng bánh để phục vụ khách. Như mọi người phục vụ bánh giỏi, bạn có thị lực tia X và biết mỗi chiếc đang ngửa mặt vui hay mặt trống. Bạn nghĩ khách sẽ vui nhất nếu khi phục vụ, mọi chiếc bánh đều ngửa mặt vui.

Bạn biết thao tác sau: cẩn thận nhấc một số chiếc ở đỉnh chồng (có thể là toàn bộ), lật cả nhóm, rồi đặt lại lên những chiếc không nhấc. Cả nhóm được lật trong một chuyển động, không lật riêng từng chiếc. Chính xác hơn, đánh số bánh \(1,2,\ldots,N\) từ trên xuống dưới và chọn \(i\) chiếc đầu. Sau khi lật, thứ tự là \(i,i-1,\ldots,2,1,i+1,\ldots,N\). Các bánh \(1\) đến \(i\) đổi mặt đang ngửa; các bánh \(i+1\) đến \(N\) giữ nguyên mặt.

Ký hiệu mặt vui là +, mặt trống là -. Với chồng --+- từ trên xuống, có thể nhấc ba chiếc đầu, lật cả nhóm rồi đặt lên chiếc thứ tư không đổi, thu được -++-. Những thao tác hợp lệ khác là lật một, hai hoặc cả bốn chiếc đầu. Không được lật hai chiếc ở giữa hay riêng chiếc cuối vì chỉ được lấy một đoạn bắt đầu từ đỉnh.

Bạn sẽ không phục vụ cho đến khi mọi bánh đều ngửa mặt vui, nhưng không muốn bánh nguội. Nếu luôn lựa chọn tối ưu, cần ít nhất bao nhiêu thao tác?

Dữ liệu vào

Dòng đầu chứa \(T\). Mỗi bộ test gồm một chuỗi \(S\); mỗi ký tự là + (ban đầu ngửa mặt vui) hoặc - (ban đầu ngửa mặt trống). Đọc từ trái sang phải tương ứng với chồng bánh từ trên xuống dưới.

Dữ liệu ra

Với mỗi bộ test, in Case #x: y, trong đó \(x\) bắt đầu từ 1 và \(y\) là số thao tác nhỏ nhất để mọi bánh ngửa mặt vui.

Ràng buộc

  • \(1\le T\le100\).
  • Mọi ký tự của \(S\)+ hoặc -.

Phân nhóm

  • Test Set 1 (Visible): \(1\le |S|\le10\).
  • Test Set 2 (Hidden): \(1\le |S|\le100\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 10/20 50%
Test Set 2 10/20 50%

Ví dụ

Ví dụ 1

Input
5
-
-+
+-
+++
--+-
Output
Case #1: 1
Case #2: 1
Case #3: 2
Case #4: 0
Case #5: 3
Giải thích

Ở #1 chỉ cần lật chiếc duy nhất. Ở #2 chỉ cần lật chiếc đầu.

Ở #3 cần hai thao tác. Một cách tối ưu là lật chiếc đầu để thành --, rồi lật cả hai để thành ++. Không thể chỉ lật riêng chiếc dưới cùng; mỗi thao tác phải chọn một đoạn từ đỉnh.

Ở #4 mọi bánh đã ngửa mặt vui nên không cần làm gì.

Ở #5, một cách là lật toàn bộ để được +-++, lật chiếc đầu để được --++, rồi lật hai chiếc đầu để được ++++.

Nguồn

Google Code Jam 2016, Vòng loại, bài Revenge of the Pancakes.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.