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.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.400 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.2 gforth 0.7.3 gfortran 12.2.0 go 1.27.0 groovyc 5.1.1 javac 25.0.4 node 26.8.1 julia 1.12.7 kotlinc 2.4.10 lean 4.33.1 sbcl 2.2.9 lua 5.4.9 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.10 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.14.7 racket 8.7 ruby 4.0.6 rustc 1.98.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.3.3 tclsh 8.6 bun 1.4.0 deno 2.9.6 v 0.5.2 zig 0.16.0