Sơ đồ Định Tuyến
Nộp bài giải
Điểm:
1,00 (OI)
Giới hạn thời gian:
4.0s
Python 3
5.0s
Giới hạn bộ nhớ:
256M
Đầu vào:
stdin
Đầu ra:
stdout
Tác giả:
Dạng bài
Ngôn ngữ cho phép
C++, Go, Java, Kotlin, Pascal, Python, Scratch
Cho một mạng gồm nút đánh số từ đến , kết nối bởi các cạnh có hướng. Mỗi nút được gán nhãn: S (nguồn), R (đích), hoặc . (trung gian). Số lượng nút nguồn bằng số lượng nút đích.
Một sơ đồ định tuyến là tập hợp các đường đi có hướng từ các nút nguồn đến các nút đích sao cho:
- Mỗi cạnh trong đồ thị được đi qua đúng một lần (bởi đúng một đường đi).
- Không có hai đường đi nào chia sẻ cùng nút đầu hoặc nút cuối.
- Không có đường đi nào tạo thành vòng lặp (chu trình).
Đồ thị được mô tả bởi ma trận kề (ký tự 0/1). Mọi cạnh đều thỏa mãn , ngoại trừ đúng cạnh có (gọi là cạnh ngược).
Đếm số sơ đồ định tuyến hợp lệ, theo modulo .
Dữ liệu vào
Dòng đầu tiên chứa — số lượng test case.
Với mỗi test case:
- Dòng đầu: hai số nguyên và .
- Dòng tiếp theo: xâu độ dài gồm các ký tự
S,R,.mô tả loại mỗi nút. - dòng tiếp theo: mỗi dòng là xâu nhị phân độ dài , dòng mô tả các cạnh xuất phát từ nút (ký tự là
1nếu có cạnh ).
Dữ liệu ra
Với mỗi test case, in ra một số nguyên — số sơ đồ định tuyến hợp lệ modulo .
Ràng buộc
- — số cạnh với
- Luôn tồn tại ít nhất một sơ đồ định tuyến hợp lệ
- Tại mỗi nút :
Subtask:
- Test 4–5:
- Test 6–7:
- Test 8–12:
- Test 13–24:
Ví dụ
| Input | Output | Giải thích |
|---|---|---|
| 2 8 0 SS....RR 00100000 00100000 00011000 00000100 00000100 00000011 00000000 00000000 13 0 SSS.RRRSS.RR. 0001000000000 0001000000000 0001000000000 0000111000000 0000000000000 0000000000000 0000000000000 0000000001000 0000000001000 0000000000110 0000000000000 0000000000000 0000000000000 |
4 12 |
Test 1 (N=8, K=0): Đồ thị là 1→3, 2→3, 3→{4,5}, 4→6, 5→6, 6→{7,8}. Tại nút 3: 2 đường vào có thể ghép với 2 đường ra theo 2! = 2 cách. Tại nút 6: tương tự 2! = 2 cách. Tổng = 2×2 = 4. Test 2 (N=13, K=0): Tích các bậc ra: 1!×1!×1!×3!×1!×1!×2! = 6×2 = 12. |
| 2 5 1 SS.RR 00101 00100 10010 00000 00000 6 2 S....R 001000 000100 010001 000010 001000 000000 |
3 1 |
Test 1 (N=5, K=1): Cạnh ngược: 3→1. Không có sơ đồ nào tạo chu trình qua cạnh này. Tổng = 2!×1!×2! × (1 - P[chu trình]) = 4 × 3/4 = 3. Test 2 (N=6, K=2): Hai cạnh ngược: 3→2 và 5→3. Chỉ có 1 sơ đồ hợp lệ: nguồn 1 đi thẳng 1→3→6 (đích), tránh tạo chu trình 3→2→4→5→3. |
Ghi chú
- Cạnh ngược là cạnh với (chỉ số nút lớn hơn đến nhỏ hơn).
- Do tất cả cạnh xuôi () không thể tạo chu trình trong thứ tự tô-pô, chỉ cạnh ngược mới có thể gây ra vòng lặp.
Bình luận