Google Code Jam 2016 - Family Hotel

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: 2400 Thời gian: 5.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Bạn điều hành một khách sạn có \(N\) phòng nằm dọc theo một hành lang dài, được đánh số từ 1 đến \(N\). Khách của bạn là những đại gia đình, và mỗi gia đình khi đến đều yêu cầu đúng hai phòng kề nhau. Hai phòng được coi là kề nhau nếu số phòng chênh nhau đúng 1.

Đầu ngày hôm nay, khách sạn hoàn toàn trống. Bạn dùng chiến lược đơn giản sau để xếp phòng. Mỗi khi một gia đình đến, bạn xét tất cả các cặp phòng kề nhau mà cả hai phòng đều còn trống, chọn ngẫu nhiên đều một cặp trong số đó, rồi giao hai phòng ấy cho gia đình. Các gia đình liên tục đến, mỗi lần một gia đình; nhưng ngay khi không còn cặp phòng kề nhau nào cùng trống, bạn bật biển HẾT PHÒNG và không giao thêm phòng nữa.

Với một số phòng cụ thể, xác suất để phòng đó đã có người ở vào lúc bạn bật biển HẾT PHÒNG là bao nhiêu?

Dữ liệu vào

Dòng đầu chứa số bộ test \(T\). Tiếp theo là \(T\) dòng; mỗi dòng chứa hai số: số phòng \(N\) và số hiệu phòng \(K\) mà ta quan tâm.

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à xác suất cần tìm tính theo modulo \(10^9+7\), được định nghĩa chính xác như sau.

Biểu diễn xác suất phòng \(K\) có người ở dưới dạng phân số tối giản p/q. Khi đó y phải thỏa mãn

\[yq \equiv p \pmod {10^9+7},\]

và nằm trong đoạn từ 0 đến \(10^9+6\), kể cả hai đầu. Có thể chứng minh rằng dưới các ràng buộc của bài, y luôn tồn tại và được xác định duy nhất.

Ràng buộc

  • \(1 \le T \le 100\).
  • \(1 \le K \le N\).

Phân nhóm

  • Test Set 1 (Hiển thị): \(2 \le N \le 10^4\).
  • Test Set 2 (Ẩn): \(2 \le N \le 10^7\).

Đ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
4
3 1
3 2
4 1
4 2
Output
Case #1: 500000004
Case #2: 1
Case #3: 666666672
Case #4: 1
Giải thích

Trong bộ test mẫu số 3, có bốn phòng và ta cần xác suất phòng đầu tiên có người ở. Khi gia đình đầu tiên đến, có ba khả năng, mỗi khả năng có xác suất \(1/3\): họ nhận phòng 1+2, 2+3 hoặc 3+4. Ở khả năng thứ nhất, phòng đầu tiên đã có người và sẽ tiếp tục có người. Ở khả năng thứ hai, phòng đầu tiên còn trống nhưng không thể đón thêm gia đình nào, nên nó sẽ tiếp tục trống. Cuối cùng, ở khả năng thứ ba, gia đình tiếp theo chắc chắn nhận phòng 1+2, nên phòng đầu tiên sẽ có người. Vì vậy xác suất là \(2/3\), và đáp án là 666666672 vì \((666666672\times3)\bmod 1000000007=2\bmod 1000000007\).

Xác suất trong bộ test mẫu số 1 là \(1/2\); trong các bộ test mẫu số 2 và 4, xác suất là 1.

Nguồn

Google Code Jam 2016, Chung kết thế giới, bài Family Hotel.

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: