| # | 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 |
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\) và \(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ò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}\) và \(\mathbf{K}\): số máy và số intranet mục tiêu.
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 đó
với \(q^{-1}\) là 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.
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ụ 1
3
5 2
5 1
6 3
Case #1: 428571432
Case #2: 571428576
Case #3: 47619048
Trong bộ test mẫu số 1, gọi năm máy \(\mathbf{M}=5\) là \(1,2,3,4,5\) và ký hiệu liên kết nối máy \(a\) với máy \(b\) là \((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\) và \(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\) và \(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\).
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.
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ò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.
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.
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ụ 1
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
Case #1: ZZZZZJAMMICCODEEEL
Case #2: IMPOSSIBLE
Case #3: IMPOSSIBLE
Case #4: IMPOSSIBLE
Case #5: BBBBBAAAAA
Case #6: IMPOSSIBLE
Trong bộ test mẫu số 1, JAMMICCODEEELZZZZZ và ZZZZZJAMMICCODEEEL 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 EEL và EEK 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.
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.
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ò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\) và \(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.
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.
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% |
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
4
2 1
-2 6
2 1
-10 10
1 1
0
3 1
2 -2 2
Case #1: 3
Case #2: IMPOSSIBLE
Case #3: -1000000000000000000
Case #4: 2
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.
3
3 10
-2 3 6
6 2
-2 2 1 -2 4 -1
1 12
-5
Case #1: 0
Case #2: -1 15
Case #3: 1 1 1 1 1 1 1 1 1 1 1
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ử.
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.