Solutions of Long leg - MarisaOJ: Marisa Online Judge

Solutions of Long leg

Select solution language

Write solution here.


User Avatar minhnhatha    Created at    4 likes

## Khuyên thật nên động não trước khi đọc đáp đi! Tương tự như bài [Rừng tre lạc Lối](https://marisaoj.com/problem/122) khi mà ta sẽ tìm đường đi ngắn nhất có số cạnh chia hết cho $2$ bằng $BFS$, bài này là dạng tổng quát khi yêu cầu tìm đường đi ngắn nhất chia hết cho số $k$ cho trước. Ta sẽ tạo một mảng đếm $2$ chiều để lưu số cạnh đường đi kèm với số dư của nó khi chia cho $k$: $\color{lime}{\textbf{vector}}\color{red}{<}\color{lime}{\textbf{vector}} \color{red}{<}\color{blue}{\textbf{int}}\color{red}{>>}f\color{red}{(}n\color{red}{+} \color{violet}{1}\color{red}{,}\color{lime}{\textbf{vector}} \color{red}{<}\color{blue}{\textbf{int}}\color{red}{>(}k\color{red}{,-}k\color{red}{));}$ Từ $0$ đến $k - 1$ là số dư của số cạnh khi chia cho $k$. Còn với hàng đợi sẽ là: $\color{lime}{\textbf{queue}}\color{red}{<}\color{lime}{\textbf{pair}} \color{red}{<}\color{blue}{\textbf{int}}\color{red}{,}\color{blue}{\textbf{int}}\color{red}{>>} q\color{red}{;}$ để thực hiện BFS kèm trạng thái chia cho $k$ của nó. Mỗi lần $BFS$ thêm $1$ cạnh thì chuyển số dư của nó là $r$ thành $(r+1)$%$k$. Đáp án sẽ là $f[n][0]/k$. $Bonus:$ - Mảng $f$ được gán tất cả giá trị là $-k$ để in ra $f[n][0]/k$ luôn cho gọn, không mất công $if$.