trang chủ / bài tập / cutpaste37

Cắt và Dán 2

Đề bài

Mô tả

Cho xâu s chỉ gồm các chữ số 1, 2, 3. Độ dài của s ký hiệu là |s|, ký tự thứ i ký hiệu là si.

Có một con trỏ đặt tại vị trí {0,1,,|s|}: nếu =0 thì con trỏ đứng trước ký tự đầu tiên, nếu =|s| thì con trỏ đứng sau ký tự cuối cùng, ngược lại con trỏ nằm giữa ss+1. Gọi sleft là phần xâu bên trái con trỏ và sright là phần bên phải.

Ngoài ra có một bộ nhớ tạm c (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 1.
  • Cut: gán csright, sau đó gán ssleft.
  • Paste: nối thêm c vào cuối xâu s (thao tác này không làm thay đổi c).

Ban đầu =0. Ta thực hiện quy trình sau:

  1. Thực hiện Move một lần.
  2. Thực hiện Cut một lần.
  3. Thực hiện Paste đúng s lần.
  4. Nếu =x thì dừng, ngược lại quay lại bước 1.

Cho xâu ban đầu s và số nguyên x, hãy tính độ dài của s 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 109+7.

Dữ liệu đảm bảo trong suốt quá trình luôn có |s|.

Dữ liệu vào

  • Dòng đầu chứa số nguyên t: 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 x, dòng thứ hai chứa xâu s.

Dữ liệu ra

Với mỗi bộ dữ liệu, in ra trên một dòng độ dài của s khi quy trình dừng, lấy phần dư cho 109+7.

Ràng buộc

  • 1t1000
  • 1x106, tổng x trên toàn bộ file dữ liệu không vượt quá 106
  • 1|s|500, s 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: =1, cắt được c= 31 và s= 2, dán 2 lần thành s= 23131. Tiếp tục với =2 (s2= 3) được s= 23131131131, rồi =3 (s3= 1) giữ nguyên độ dài, =4 (s4= 3) và cuối cùng =5 (s5= 1) cho xâu độ dài 25.
3
1
2
4
1231
10
32211
1
12
312
Bộ đầu tiên: sau Move thì =1=s nên sright rỗng, dán bao nhiêu lần cũng không đổi, độ dài vẫn là 1. Bộ thứ hai: độ dài lần lượt là 4461212.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0