Cắt, Dán và Độ dài
Đề bài
Mô tả
Ta có một xâu chỉ gồm các chữ số , , . Độ dài của ký hiệu là , và ký tự thứ (tính từ ) ký hiệu là .
Có một con trỏ với vị trí : khi con trỏ đứng trước ký tự đầu tiên, khi con trỏ đứng sau ký tự cuối cùng, còn khi con trỏ nằm giữa và . Gọi là phần xâu bên trái con trỏ và là phần xâu bên phải con trỏ.
Ta còn có một bộ nhớ đệm , ban đầu rỗng. Có ba thao tác:
- Di chuyển: dịch con trỏ sang phải một bước, tức tăng lên .
- Cắt: gán , rồi gán .
- Dán: nối thêm giá trị của vào cuối xâu (thao tác này không làm thay đổi ).
Con trỏ bắt đầu tại . Sau đó ta lặp lại quy trình sau:
- Thực hiện thao tác Di chuyển một lần.
- Thực hiện thao tác Cắt một lần.
- Thực hiện thao tác Dán đúng lần.
- Nếu thì dừng; ngược lại quay về bước 1.
Cho xâu ban đầu và số nguyên , hãy tìm độ dài của khi quy trình dừng lại. Vì giá trị này có thể rất lớn, chỉ cần in ra phần dư khi chia cho .
Dữ liệu đảm bảo rằng tại mọi thời điểm luôn có .
Dữ liệu vào
- Dòng đầu chứa số nguyên : số lượng bộ dữ liệu.
- Với mỗi bộ dữ liệu:
- Dòng thứ nhất chứa số nguyên .
- Dòng thứ hai chứa xâu ban đầu (chỉ gồm các chữ số , , ).
Dữ liệu ra
Với mỗi bộ dữ liệu, in ra một dòng chứa độ dài của khi quy trình dừng, lấy phần dư khi chia cho .
Ràng buộc
- Tổng của trên toàn bộ tệp không vượt quá .
Ví dụ
| Input | Output | Giải thích |
|---|---|---|
| 4 5 231 7 2323 6 333 24 133321333 |
25 1438 1101 686531475 |
Với , : sau bước 1 (, ) xâu thành ; sau bước 2 (, ) thành ; các bước sau cho độ dài cuối cùng là . |
| 3 1 2 1 3 2 21 |
1 1 3 |
Hai bộ đầu có : chỉ một vòng lặp, độ dài không đổi (). Bộ thứ ba , : sau vòng () xâu thành (dài ), sau vòng () độ dài giữ nguyên . |
Bình luận