Google Code Jam 2022 - Round 1C

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2022 - Intranets 44 3.0s 1G
2 Google Code Jam 2022 - Letter Blocks 25 1.0s 1G
3 Google Code Jam 2022 - Squary 31 1.0s 1G

1. Google Code Jam 2022 - Intranets

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

Apricot Rules LLC đang phát triển một giao thức mạng đơn giản mới và muốn trình diễn thuật toán định tuyến của mình. Theo thiết kế, một mạng gồm \(\mathbf{M}\) máy được đánh số từ \(1\) đến \(\mathbf{M}\), và mỗi cặp máy được nối bằng một liên kết trực tiếp. Mỗi liên kết được gán một độ ưu tiên nguyên duy nhất trong đoạn từ \(1\) đến \(\mathbf{M}(\mathbf{M}-1)/2\), và mỗi máy định tuyến lưu lượng theo các độ ưu tiên ấy.

Không may, thuật toán định tuyến quá hung hăng: nó chuyển toàn bộ lưu lượng từ một máy qua liên kết có độ ưu tiên cao nhất nối với máy đó. Điều này có thể khiến một số nhóm máy bị cô lập khỏi các nhóm khác.

Chính xác hơn, ta nói máy \(m\) sử dụng liên kết \(\ell\) khi và chỉ khi \(\ell\) là liên kết có độ ưu tiên cao nhất nối với \(m\). Một liên kết được gọi là hoạt động nếu nó được ít nhất một trong hai máy ở hai đầu sử dụng. Với các độ ưu tiên đã cho, mạng ban đầu bị chia thành những intranet rời nhau. Hai máy thuộc cùng một intranet khi và chỉ khi tồn tại một đường đi giữa chúng chỉ dùng các liên kết hoạt động.

Trong hình bên trái ở trên, chỉ các liên kết có độ ưu tiên \(6\)\(5\) hoạt động, tạo ra hai intranet rời nhau. Trong ví dụ bên phải, ba liên kết hoạt động, tạo thành một intranet duy nhất chứa cả \(4\) máy.

Là thành viên nhóm bảo đảm chất lượng của Apricot Rules LLC, bạn đang điều tra mức độ nghiêm trọng của vấn đề. Hãy tính xác suất có đúng \(\mathbf{K}\) intranet nếu các độ ưu tiên được gán đều ngẫu nhiên trong số \(\bigl(\mathbf{M}(\mathbf{M}-1)/2\bigr)!\) cách gán.

Dữ liệu vào

Dòng đầu chứa số lượng bộ test \(\mathbf{T}\). Tiếp theo là \(\mathbf{T}\) bộ test. Mỗi bộ test gồm một dòng chứa hai số nguyên \(\mathbf{M}\)\(\mathbf{K}\): số máy và số intranet mục tiêu.

Dữ liệu ra

Với mỗi bộ test, in một dòng theo định dạng Case #x: y, trong đó \(x\) là số thứ tự bộ test (bắt đầu từ \(1\)), còn \(y\) là xác suất cần tìm, tính theo modulo số nguyên tố \(10^9+7=1000000007\), được định nghĩa chính xác như sau.

Biểu diễn xác suất thành phân số tối giản \(p/q\), trong đó \(p,q\) là các số nguyên không âm làm \(p+q\) nhỏ nhất. Khi đó

\[ y=p\cdot q^{-1}\bmod(10^9+7), \]

với \(q^{-1}\)nghịch đảo nhân modulo của \(q\) theo modulo \(10^9+7\). Có thể chứng minh rằng trong các ràng buộc của bài, \(y\) luôn tồn tại và là duy nhất.

Ràng buộc

  • \(1\le\mathbf{T}\le50\).
  • \(1\le\mathbf{K}\le\mathbf{M}/2\).

Phân nhóm

  • Test Set 1 (phán quyết hiển thị): \(2\le\mathbf{M}\le50\).
  • Test Set 2 (phán quyết ẩn): \(2\le\mathbf{M}\le5\times10^5\).

Đ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 17/44 38,64%
Test Set 2 27/44 61,36%

Ví dụ

Ví dụ 1

Input
3
5 2
5 1
6 3
Output
Case #1: 428571432
Case #2: 571428576
Case #3: 47619048
Giải thích

Trong bộ test mẫu số 1, gọi năm máy \(\mathbf{M}=5\)\(1,2,3,4,5\) và ký hiệu liên kết nối máy \(a\) với máy \(b\)\((a,b)\). Giả sử độ ưu tiên của các liên kết \((1,2),(1,3),(1,4),(1,5),(2,3),(2,4),(2,5),(3,4),(3,5),(4,5)\) lần lượt là \(9,8,7,6,5,4,3,2,1,10\).

Khi đó máy \(1\)\(2\) dùng liên kết \((1,2)\), máy \(3\) dùng liên kết \((1,3)\), còn máy \(4\)\(5\) dùng liên kết \((4,5)\). Do đó ba liên kết \((1,2),(1,3),(4,5)\) hoạt động và có hai intranet \(\{1,2,3\}\) cùng \(\{4,5\}\). Vì \(\mathbf{K}=2\), cách gán này được tính vào đáp án.

Trong \(10!=3628800\) cách gán độ ưu tiên, có \(1555200\) cách tạo đúng \(2\) intranet, nên xác suất là \(3/7\).

Trong bộ test mẫu số 2, xác suất là \(4/7\).

Trong bộ test mẫu số 3, xác suất là \(1/21\).

Nguồn

Google Code Jam 2022, Vòng 1C, bài Intranets.

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 2022 - Letter Blocks

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

Hôm nay trời mưa, vì vậy bạn ở trong nhà xây các tháp từ những khối chữ cái. Một khối chữ cái là khối lập phương bằng gỗ có một chữ được in trên một mặt. Phông chữ khiến các khối có hướng rõ ràng: chỉ có một mặt có thể quay xuống sàn và một mặt có thể quay lên trần.

Bạn đã xây nhiều tháp riêng biệt. Bây giờ, bạn muốn ghép tất cả thành một siêu tháp: chọn một tháp làm đáy, nhấc một tháp khác lên mà không thay đổi thứ tự các khối trong nó rồi đặt nguyên tháp ấy lên trên, tiếp tục như vậy cho đến khi dùng hết mọi tháp.

Siêu tháp còn phải thỏa điều kiện: với hai khối bất kỳ mang cùng một chữ cái, mọi khối nằm giữa chúng cũng phải mang chữ ấy. Nói cách khác, mỗi chữ cái xuất hiện trong siêu tháp phải tạo thành đúng một nhóm liên tiếp gồm một hoặc nhiều khối.

Xét ba siêu tháp minh họa dưới đây. Đây là ba ví dụ riêng biệt, không được xây từ cùng một tập tháp ban đầu. Kích thước các khối khác nhau chỉ để hình vẽ vui mắt và không phải một phần của bài toán.

Hai siêu tháp bên trái hợp lệ vì mỗi chữ xuất hiện trong một nhóm liên tiếp. Siêu tháp ngoài cùng bên phải không hợp lệ vì có một chữ B nằm giữa hai chữ C.

Với các tháp đã xây, liệu bạn có thể xếp tất cả thành một siêu tháp hợp lệ không?

Dữ liệu vào

Dòng đầu chứa số lượng bộ test \(\mathbf{T}\). Tiếp theo là \(\mathbf{T}\) bộ test, mỗi bộ được mô tả bằng hai dòng.

Dòng đầu của mỗi bộ test chứa số nguyên \(\mathbf{N}\), là số tháp hiện có. Dòng thứ hai chứa \(\mathbf{N}\) chuỗi \(\mathbf{S}_1,\mathbf{S}_2,\ldots,\mathbf{S}_\mathbf{N}\) biểu diễn các tháp. Mỗi chuỗi chỉ gồm chữ cái in hoa. Ký tự thứ \(i\) của một chuỗi là chữ trên khối thứ \(i\) tính từ đáy của tháp tương ứng.

Dữ liệu ra

Với mỗi bộ test, in một dòng theo định dạng Case #x: y, trong đó \(x\) là số thứ tự bộ test (bắt đầu từ \(1\)), còn \(y\) là chuỗi biểu diễn một siêu tháp hợp lệ như mô tả, hoặc từ IMPOSSIBLE nếu không thể xây siêu tháp hợp lệ. Lưu ý rằng bản thân chuỗi IMPOSSIBLE không bao giờ biểu diễn một siêu tháp hợp lệ, vì giữa hai chữ I có các chữ khác.

Ràng buộc

  • \(1\le\mathbf{T}\le100\).
  • \(1\le|\mathbf{S}_i|\le10\) với mọi \(i\).

Phân nhóm

  • Test Set 1 (phán quyết hiển thị): \(2\le\mathbf{N}\le6\).
  • Test Set 2 (phán quyết hiển thị): \(2\le\mathbf{N}\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/25 40%
Test Set 2 15/25 60%

Ví dụ

Ví dụ 1

Input
6
5
CODE JAM MIC EEL ZZZZZ
6
CODE JAM MIC EEL ZZZZZ EEK
2
OY YO
2
HASH CODE
6
A AA BB A BA BB
2
CAT TAX
Output
Case #1: ZZZZZJAMMICCODEEEL
Case #2: IMPOSSIBLE
Case #3: IMPOSSIBLE
Case #4: IMPOSSIBLE
Case #5: BBBBBAAAAA
Case #6: IMPOSSIBLE
Giải thích

Trong bộ test mẫu số 1, JAMMICCODEEELZZZZZZZZZZJAMMICCODEEEL là hai đầu ra hợp lệ duy nhất.

Trong bộ test mẫu số 2, phải dùng tất cả các tháp. Năm tháp đầu có thể tạo siêu tháp hợp lệ như ở mẫu số 1, nhưng tháp EEK bổ sung khiến trường hợp này bất khả thi. Dù xếp EELEEK theo thứ tự nào so với nhau, vẫn có ít nhất hai nhóm chữ E không liên tiếp.

Trong bộ test mẫu số 3, dù xếp các tháp theo thứ tự nào, hoặc hai chữ O không liên tiếp, hoặc hai chữ Y không liên tiếp.

Trong bộ test mẫu số 4, có các chữ khác H nằm giữa những chữ H trong HASH, nên cũng không thể tạo siêu tháp hợp lệ.

Trong bộ test mẫu số 5, đáp án được in là đáp án hợp lệ duy nhất. Các tháp không nhất thiết phải đôi một khác nhau.

Trong bộ test mẫu số 6, dù xếp các tháp theo thứ tự nào, hai chữ A cũng không thể liên tiếp.

Nguồn

Google Code Jam 2022, Vòng 1C, bài Letter Blocks.

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 2022 - Squary

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

Phép cộng và phép bình phương không có tính giao hoán theo nghĩa sau: bình phương của tổng mọi phần tử trong một danh sách số nguyên không nhất thiết bằng tổng bình phương của chính các phần tử ấy. Tuy nhiên, đẳng thức này đúng với một số danh sách. Chẳng hạn, danh sách \([3,-2,6]\) thỏa mãn
\((3+(-2)+6)^2=49=3^2+(-2)^2+6^2\). Ta gọi những danh sách như vậy là squary.

Cho một danh sách các số nguyên tương đối nhỏ, không nhất thiết đã là squary, hãy xác định liệu có thể thêm ít nhất \(1\) và nhiều nhất \(K\) phần tử để danh sách cuối cùng trở thành squary hay không. Mỗi phần tử được thêm phải là một số nguyên trong đoạn \([-10^{18},10^{18}]\); các phần tử thêm vào không cần khác nhau, cũng không cần khác các phần tử ban đầu.

Dữ liệu vào

Dòng đầu chứa số lượng bộ test \(T\). Mỗi bộ test gồm hai dòng. Dòng đầu chứa hai số nguyên \(N\)\(K\), lần lượt là số phần tử của danh sách ban đầu và số phần tử tối đa được phép thêm. Dòng thứ hai chứa \(N\) số nguyên \(E_1,E_2,\ldots,E_N\), là các phần tử của danh sách ban đầu.

Dữ liệu ra

Với mỗi bộ test, in một dòng theo dạng Case #x: y, trong đó \(x\) là số thứ tự bộ test, bắt đầu từ \(1\).

Nếu có thể thêm từ \(1\) đến \(K\) phần tử, mỗi phần tử thuộc \([-10^{18},10^{18}]\), để bình phương tổng các phần tử bằng tổng bình phương các phần tử, thì \(y\) phải là \(z_1\ z_2\ \ldots\ z_r\), với \(1\le r\le K\), trong đó các \(z_i\) là những phần tử được thêm. Nếu không thể, \(y\) phải là IMPOSSIBLE.

Ràng buộc

  • \(1\le T\le100\).
  • \(1\le N\le1000\).
  • \(-1000\le E_i\le1000\) với mọi \(i\).

Phân nhóm

  • Test Set 1 (phán quyết hiển thị): \(K=1\).
  • Test Set 2 (phán quyết hiển thị): \(2\le K\le1000\).

Đ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 9/31 29,03%
Test Set 2 22/31 70,97%

Ví dụ

Lưu ý: phía dưới còn có các ví dụ bổ sung không được dùng để chạy bài nộp.

Ví dụ 1

Input
4
2 1
-2 6
2 1
-10 10
1 1
0
3 1
2 -2 2
Output
Case #1: 3
Case #2: IMPOSSIBLE
Case #3: -1000000000000000000
Case #4: 2
Giải thích

Trong test mẫu số 1, sau khi thêm \(3\), ta thu được danh sách ví dụ đã nêu trong đề.

Trong test mẫu số 2, ta buộc phải thêm đúng một phần tử. Gọi phần tử đó là \(x\). Tổng của toàn bộ danh sách bằng \(x\), nên bình phương tổng bằng \(x^2\). Trong khi đó, tổng bình phương các phần tử là \(x^2+10^2+(-10)^2=x^2+200\ne x^2\), vì vậy test này là bất khả thi.

Trong test mẫu số 3, mọi số nguyên thuộc đoạn \([-10^{18},10^{18}]\) đều là đáp án hợp lệ.

Trong test mẫu số 4, dữ liệu vào có thể chứa các phần tử trùng nhau, và ta cũng được phép tạo thêm phần tử trùng bằng những số mình chọn thêm.

Ví dụ bổ sung — Test Set 2

Ví dụ bổ sung sau thỏa các giới hạn của Test Set 2 và sẽ không được chạy với bài nộp.

Input
3
3 10
-2 3 6
6 2
-2 2 1 -2 4 -1
1 12
-5
Output
Case #1: 0
Case #2: -1 15
Case #3: 1 1 1 1 1 1 1 1 1 1 1
Giải thích

Trong test số 1 của ví dụ bổ sung, danh sách đầu vào chính là danh sách ví dụ trong đề và vốn đã là squary, nhưng ta vẫn phải thêm ít nhất một phần tử. Thêm \(0\) sẽ giữ cho danh sách là squary.

Trong test số 3 của ví dụ bổ sung, đầu ra trình bày một trong nhiều đáp án hợp lệ. Lưu ý rằng ta được phép thêm ít hơn \(K\) phần tử: ở đây \(K=12\) nhưng ta chỉ thêm \(11\) phần tử.

Nguồn

Google Code Jam 2022, Vòng 1C, bài Squary.

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