Cắt và Dán 2
Đề bài
Mô tả
Cho xâu chỉ gồm các chữ số , , . Độ dài của ký hiệu là , ký tự thứ ký hiệu là .
Có một con trỏ đặt tại vị trí : nếu thì con trỏ đứng trước ký tự đầu tiên, nếu thì con trỏ đứng sau ký tự cuối cùng, ngược lại con trỏ nằm giữa và . Gọi là phần xâu bên trái con trỏ và là phần bên phải.
Ngoài ra có một bộ nhớ tạm (ban đầu rỗng) và ba loại thao tác:
- Move: dịch con trỏ sang phải một bước, tức là tăng lên .
- Cut: gán , sau đó gán .
- Paste: nối thêm vào cuối xâu (thao tác này không làm thay đổi ).
Ban đầu . Ta thực hiện quy trình sau:
- Thực hiện Move một lần.
- Thực hiện Cut một lần.
- Thực hiện Paste đúng lần.
- Nếu thì dừng, ngược lại quay lại bước 1.
Cho xâu ban đầu và số nguyên , hãy tính độ 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 trong suốt quá trình luôn có .
Dữ liệu vào
- Dòng đầu chứa số nguyên : số lượng bộ dữ liệu.
- Mỗi bộ dữ liệu gồm hai dòng: dòng thứ nhất chứa số nguyên , dòng thứ hai chứa xâu .
Dữ liệu ra
Với mỗi bộ dữ liệu, in ra trên một dòng độ dài của khi quy trình dừng, lấy phần dư cho .
Ràng buộc
- , tổng trên toàn bộ file dữ liệu không vượt quá
- , chỉ gồm các chữ số 1, 2, 3
Ví dụ
| Input | Output | Giải thích |
|---|---|---|
| 4 5 231 7 2323 6 333 24 133321333 |
25 1438 1101 686531475 |
Với bộ đầu tiên: , cắt được 31 và 2, dán lần thành 23131. Tiếp tục với ( 3) được 23131131131, rồi ( 1) giữ nguyên độ dài, ( 3) và cuối cùng ( 1) cho xâu độ dài . |
| 3 1 2 4 1231 10 32211 |
1 12 312 |
Bộ đầu tiên: sau Move thì nên rỗng, dán bao nhiêu lần cũng không đổi, độ dài vẫn là . Bộ thứ hai: độ dài lần lượt là . |
Bình luận