Hướng dẫn cho Lát gạch


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: jumptozero

Mình xin chia sẻ lời giải bài này, như sau:

Gọi \(F[n]\) là số cách lát các viên gạch nhỏ \(1\text{ x }2\)\(2\text{ x }1\) vào hình chữ nhất có kích thước \(2\text{ x }N\) thoả mãn yêu cầu bài toán, khi đó ta sẽ xây dựng công thức \(F[n]\) theo \(2\) cách như sau:

  • Cách 1: Giả sử ta đã lát được hình chữ nhật có kích thước \(2\text{ x }(N-1)\). Do đó, trường hợp này ta chỉ cần lát thêm \(1\) viên có kích thước \(2\text{ x }1\) là ta thu được hình chữ nhật có kích thước \(2\text{ x }N\). Do vậy ta có: \(F[n-1]\) cách xây dựng thành \(F[n]\) cho trường hợp này.

  • Cách 2: Giả sử ta đã lát được hình chữ nhật có kích thước \(2\text{ x }(N-2)\). Do đó, trường hợp này ta cũng chỉ có một cách lắp thêm để thu được hình chữ nhật có kích thước \(2\text{ x }N\). Đó là ta xếp \(2\) hình chữ nhật có kích thước \(1\text{ x }2\). (Sở dĩ ta không xếp \(2\) hình chữ nhật có kích thước \(2\text{ x }1\) vì như vậy nó sẽ bị trùng ở cách 1). Do vậy ta có \(F[n-2]\) cách xây dựng \(F[n]\) cho trường hợp này.

Ảnh minh hoạ:

Từ đây ta suy ra được \(F[n]=F[n-1]+F[n-2]\), và ta dễ dàng tính được \(F[1]=1,F[2]=2\).

Tiếp theo, chúng ta sẽ đi tính \(F[n]\). Ta có một nhận xét rằng, vì \(N\sim 10^9\). Nên nếu ta dùng một for thông thì chắc chắn sẽ bị \(TLE\). Nên ở đây, mình sẽ dùng nhân ma trận (một công cụ hữu hiệu để giải những bài toán này) với độ phức tạp là \(O(log(n))\).

Về cách xây dựng, hoàn toàn tương tự cách \(3\) trong lời giải của bài Đo nước nên mình sẽ không trình bày lại, và sẽ ghi kết quả ra đây luôn.

Đó là từ \(F[n] = F[n-1]+F[n-2]\implies \begin{pmatrix} F[n-1] & F[n] \end{pmatrix} . \begin{pmatrix} 0 & 1 \\ 1 & 1 \end{pmatrix} = \begin{pmatrix} F[n]& F[n+1] \end{pmatrix}\)

Đặt $p_n = \begin{pmatrix} F[n] & F[n+1] \end{pmatrix} $ và \(M = \begin{pmatrix} 0 & 1 \\ 1 & 1 \end{pmatrix}\)

Khi đó ta suy ra được: \(p_n=p_{n-1}.M=...=p_1.M^{n-1}\).

Vậy \(p_n=p_1.M^{n-1}\) , trong đó: \(p_1=\begin{pmatrix} F[1] & F[2] \end{pmatrix}\).

Và công việc còn lại của chúng ta là dùng luỹ thừa nhị phân để tính \(M^{n-1}\) và thực hiện các phép nhân ma trận là xong.

Như vậy là bài toán đã được giải quyết, các bạn có thể xem code của mình tại đây



Bình luận

Không có bình luận nào.