Hướng giải của Số cách đi quân mã (Olympic 30/4 K10 - 2023)
Nhớ rằng hướng dẫn giải này chỉ nên sử dụng khi bế tắc, và tuyệt đối không nên sao chép mã nguồn kèm theo. Hãy tôn trọng tác giả bài tập và người viết hướng dẫn giải.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.
Nếu có cách đi từ ô \((x_i, y_i)\) đến ô \((m, n)\) theo một tuyến đường nào đó thì sẽ có cách đi từ ô \((m, n)\) đến ô \((x_i, y_i)\) theo chiều ngược lại (cũng theo tuyến đường này).
Do đó ta thực hiện như sau:
- Dùng thuật toán tìm kiếm theo chiều rộng hoặc quy hoạch động để tìm số cách \(SC[i, j]\) đi từ ô \((m, n)\) đến ô \((x_i, y_i)\) bất kỳ của bàn cờ. Thao tác này tốn thời gian tỉ lệ với \((m + n) \times n\).
- Ứng với mỗi truy vấn \((x_i, y_i)\), ta xuất \(S[i, j]\) nên chỉ mất \(O(1)\).
Với \(Q\) truy vấn, tổng thời gian xử lý sẽ \(O(Q)\).
Tổng cộng, độ phức tạp của thuật toán là \(O(Q+(m+n) \times n)\)
Lưu ý: Trong quá trình tính \(SC[i, j]\), ta có sử dụng phép toán lấy phần dư của phép chia cho \(10^9\).
Nhận xét