Hướng dẫn giải của Liên Minh
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lời giải: Liên Minh
Hướng tiếp cận
Phân tích theo từng thành phần liên thông. Với mỗi thành phần có đỉnh và cạnh, số cách gán hợp lệ phụ thuộc vào quan hệ giữa và . Nhân kết quả tất cả thành phần lại với nhau (modulo ).
Nhận xét quan trọng
- Với , tổng số cạnh nhỏ hơn số đỉnh. Mỗi thành phần liên thông chỉ có thể là:
- Cây (): có đúng cách gán hợp lệ (mỗi cạnh trong cây có thể là "cạnh gốc" để gán các đỉnh).
- Unicyclic (, đúng một chu trình): có đúng cách gán hợp lệ.
- : không thể xảy ra vì nên cho hầu hết thành phần. Nhưng nếu xảy ra: trả về .
- Đỉnh cô lập (): là trường hợp đặc biệt của cây với , nhưng không có cạnh kề để gán, nên không có cách gán — kết quả là .
Thuật toán
- Đọc đồ thị đỉnh cạnh (vô hướng).
- Với mỗi đỉnh chưa thăm, DFS để tính (số đỉnh) và (số cạnh, chia 2 vì mỗi cạnh đếm 2 lần) của thành phần liên thông.
- Phân tích thành phần:
- Nếu : in và kết thúc.
- Nếu (cây): nhân đáp án với .
- Nếu (unicyclic): nhân đáp án với .
- Nếu (có đỉnh cô lập): in và kết thúc.
- In đáp án modulo .
Độ phức tạp
- Thời gian:
- Bộ nhớ:
Bình luận