Google Code Jam 2008 - Rainbow Trees

Xem PDF




Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 1700 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Trong lý thuyết đồ thị, một cây là một đồ thị đơn vô hướng, liên thông và không có chu trình. Một cây có \(n\) nút luôn có \(n - 1\) cạnh.

Một đường đi trong cây là một dãy các cạnh phân biệt liên tiếp nhau (mỗi cặp cạnh liên tiếp trong đường đi chia sẻ chung một đỉnh).

Xét một cây có \(n\) đỉnh và \(n - 1\) cạnh. Bạn có thể tô mỗi cạnh bằng một trong \(k\) màu.

Một cách tô màu các cạnh được gọi là tô màu cầu vồng (rainbow coloring) nếu trong mọi đường đi có độ dài 2 hoặc 3 cạnh, màu của các cạnh đều khác nhau. (Nghĩa là, cứ hai cạnh liên tiếp bất kỳ phải có màu khác nhau, và cứ ba cạnh liên tiếp bất kỳ phải có màu khác nhau).

Cho một cây và số lượng màu \(k\), hãy tìm số cách tô màu cầu vồng modulo \(1000000009\).

Dữ liệu vào

Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(C\). Sau đó, với mỗi bộ trong số \(C\) bộ test:

  • Một dòng chứa hai số nguyên theo định dạng "\(n\) \(k\)". \(n\) là số nút trong cây, và \(k\) là số màu có sẵn.
  • \(n - 1\) dòng, mỗi dòng cho một cạnh, chứa hai số nguyên "\(x\) \(y\)", cho biết có một cạnh giữa nút \(x\) và nút \(y\). Các nút được đánh số từ 1 đến \(n\).

Dữ liệu ra

Với mỗi bộ test, xuất một dòng. Dòng đó phải chứa "Case #\(X\): \(Y\)", trong đó \(X\) là số thứ tự của bộ test (bắt đầu từ 1) và \(Y\) là đáp án cho bộ test đó.

Ràng buộc

  • \(1 \le k \le 1000000000\).
  • Tất cả các số hiệu nút nằm trong khoảng từ 1 đến \(n\), bao gồm cả hai đầu mút.

Phân nhóm

  • Small dataset (Test set 1): \(1 \le C \le 100\); \(2 \le n \le 20\).
  • Large dataset (Test set 2): \(1 \le C \le 40\); \(2 \le n \le 500\).

Đ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/24 37,5%
Test Set 2 15/24 62,5%

Ví dụ

Ví dụ 1

Input
2
4 10
1 2
1 3
1 4
5 3
1 2
2 3
3 4
4 5
Output
Case #1: 720
Case #2: 6
Note

Trong trường hợp đầu tiên, cây có bốn nút. Có các cạnh từ một nút đến mỗi nút trong ba nút còn lại. Mỗi cặp cạnh này đều kề nhau, vì vậy để có một cách tô màu cầu vồng, tất cả các cạnh phải có màu khác nhau. Do đó có \(10 \times 9 \times 8 = 720\) cách tô màu cầu vồng.

Trong trường hợp thứ hai, bản thân cây là một đường đi gồm 4 cạnh và có 3 màu. Ba cạnh đầu tiên phải có màu khác nhau, vì vậy có \(3 \times 2 \times 1\) cách tô màu cho chúng, và sau đó chỉ còn một lựa chọn cho cạnh thứ tư, do đó có 6 cách tô màu cầu vồng.

Nguồn

Google Code Jam 2008, Vòng bán kết EMEA, bài Rainbow Trees.

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

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: