CF1280A.Cut and Paste
普及+/提高
通过率:0%
时间限制:2.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
We start with a string s consisting only of the digits 1, 2, or 3. The length of s is denoted by ∣s∣. For each i from 1 to ∣s∣, the i-th character of s is denoted by si.
There is one cursor. The cursor's location ℓ is denoted by an integer in 0,…,∣s∣, with the following meaning:
- If ℓ=0, then the cursor is located before the first character of s.
- If ℓ=∣s∣, then the cursor is located right after the last character of s.
- If 0<ℓ<∣s∣, then the cursor is located between sℓ and sℓ+1.
We denote by sleft the string to the left of the cursor and sright the string to the right of the cursor.
We also have a string c, which we call our clipboard, which starts out as empty. There are three types of actions:
- The Move action. Move the cursor one step to the right. This increments ℓ once.
- The Cut action. Set c←sright, then set s←sleft.
- The Paste action. Append the value of c to the end of the string s. Note that this doesn't modify c.
The cursor initially starts at ℓ=0. Then, we perform the following procedure:
- Perform the Move action once.
- Perform the Cut action once.
- Perform the Paste action sℓ times.
- If ℓ=x, stop. Otherwise, return to step 1.
You're given the initial string s and the integer x. What is the length of s when the procedure stops? Since this value may be very large, only find it modulo 109+7.
It is guaranteed that ℓ≤∣s∣ at any time.
我们从一个仅由数字 1、2 或 3 组成的字符串 s 出发。s 的长度记为 ∣s∣。对每个从 1 到 ∣s∣ 的整数 i,s 的第 i 个字符记为 si。
有一个光标。光标的位置 ℓ 是一个取值于 {0,…,∣s∣} 的整数,其含义如下:
- 若 ℓ=0,则光标位于 s 的第一个字符之前;
- 若 ℓ=∣s∣,则光标位于 s 的最后一个字符之后;
- 若 0<ℓ<∣s∣,则光标位于 sℓ 与 sℓ+1 之间。
记 sleft 为光标左侧的子串,sright 为光标右侧的子串。
此外,我们还有一个字符串 c,称为剪贴板(clipboard),初始为空。共有三种操作:
- 移动(Move)操作:将光标向右移动一步,即 ℓ 增加 1;
- 剪切(Cut)操作:令 c←sright,然后令 s←sleft;
- 粘贴(Paste)操作:将 c 的当前值追加到字符串 s 的末尾(注意:该操作不改变 c)。
光标初始位置为 ℓ=0。随后,我们执行以下过程:
- 执行一次 Move 操作;
- 执行一次 Cut 操作;
- 执行 sℓ 次 Paste 操作(注意:此处 sℓ 表示当前字符串 s 中下标为 ℓ 的字符所代表的数字,即若 sℓ=′2′,则执行 2 次 Paste);
- 若 ℓ=x,则停止;否则返回步骤 1。
给定初始字符串 s 和整数 x,求该过程停止时 s 的长度。由于该值可能极大,请只输出它对 109+7 取模的结果。
保证在任意时刻均有 ℓ≤∣s∣。
输入格式
The first line of input contains a single integer t (1≤t≤1000) denoting the number of test cases. The next lines contain descriptions of the test cases.
The first line of each test case contains a single integer x (1≤x≤106). The second line of each test case consists of the initial string s (1≤∣s∣≤500). It is guaranteed, that s consists of the characters "1", "2", "3".
It is guaranteed that the sum of x in a single file is at most 106. It is guaranteed that in each test case before the procedure will stop it will be true that ℓ≤∣s∣ at any time.
输入的第一行包含一个整数 t(1≤t≤1000),表示测试用例的数量。接下来的若干行包含各测试用例的描述。
每个测试用例的第一行包含一个整数 x(1≤x≤106)。每个测试用例的第二行包含初始字符串 s(1≤∣s∣≤500)。保证字符串 s 仅由字符 "1"、"2"、"3" 组成。
保证单个输入文件中所有测试用例的 x 值之和不超过 106。保证在每个测试用例中,程序停止前任意时刻均有 ℓ≤∣s∣ 成立。
输出格式
For each test case, output a single line containing a single integer denoting the answer for that test case modulo 109+7.
对于每个测试用例,输出一行,包含一个整数,表示该测试用例的答案对 109+7 取模的结果。
输入输出样例
输入#1
4 5 231 7 2323 6 333 24 133321333
输出#1
25 1438 1101 686531475
说明/提示
Let's illustrate what happens with the first test case. Initially, we have $s = $ 231. Initially, ℓ=0 and c=ε (the empty string). The following things happen if we follow the procedure above:
-
Step 1, Move once: we get ℓ=1.
-
Step 2, Cut once: we get $s = $ 2 and $c = $ 31.
-
Step 3, Paste $s_\ell = $ 2 times: we get $s = $ 23131.
-
Step 4: ℓ=1=x=5, so we return to step 1.
-
Step 1, Move once: we get ℓ=2.
-
Step 2, Cut once: we get $s = $ 23 and $c = $ 131.
-
Step 3, Paste $s_\ell = $ 3 times: we get $s = $ 23131131131.
-
Step 4: ℓ=2=x=5, so we return to step 1.
-
Step 1, Move once: we get ℓ=3.
-
Step 2, Cut once: we get $s = $ 231 and $c = $ 31131131.
-
Step 3, Paste $s_\ell = $ 1 time: we get $s = $ 23131131131.
-
Step 4: ℓ=3=x=5, so we return to step 1.
-
Step 1, Move once: we get ℓ=4.
-
Step 2, Cut once: we get $s = $ 2313 and $c = $ 1131131.
-
Step 3, Paste $s_\ell = $ 3 times: we get $s = $ 2313113113111311311131131.
-
Step 4: ℓ=4=x=5, so we return to step 1.
-
Step 1, Move once: we get ℓ=5.
-
Step 2, Cut once: we get $s = $ 23131 and $c = $ 13113111311311131131.
-
Step 3, Paste $s_\ell = $ 1 times: we get $s = $ 2313113113111311311131131.
-
Step 4: ℓ=5=x, so we stop.
At the end of the procedure, s has length 25.
我们以第一个测试用例为例说明整个过程。初始时,$s = $ 231,ℓ=0,且 c=ε(空字符串)。若按上述步骤执行,将发生以下操作:
-
第 1 步,移动一次:得到 ℓ=1。
-
第 2 步,剪切一次:得到 $s = $ 2,$c = $ 31。
-
第 3 步,粘贴 $s_\ell = $ 2 次:得到 $s = $ 23131。
-
第 4 步:ℓ=1=x=5,因此返回第 1 步。
-
第 1 步,移动一次:得到 ℓ=2。
-
第 2 步,剪切一次:得到 $s = $ 23,$c = $ 131。
-
第 3 步,粘贴 $s_\ell = $ 3 次:得到 $s = $ 23131131131。
-
第 4 步:ℓ=2=x=5,因此返回第 1 步。
-
第 1 步,移动一次:得到 ℓ=3。
-
第 2 步,剪切一次:得到 $s = $ 231,$c = $ 31131131。
-
第 3 步,粘贴 $s_\ell = $ 1 次:得到 $s = $ 23131131131。
-
第 4 步:ℓ=3=x=5,因此返回第 1 步。
-
第 1 步,移动一次:得到 ℓ=4。
-
第 2 步,剪切一次:得到 $s = $ 2313,$c = $ 1131131。
-
第 3 步,粘贴 $s_\ell = $ 3 次:得到 $s = $ 2313113113111311311131131。
-
第 4 步:ℓ=4=x=5,因此返回第 1 步。
-
第 1 步,移动一次:得到 ℓ=5。
-
第 2 步,剪切一次:得到 $s = $ 23131,$c = $ 13113111311311131131。
-
第 3 步,粘贴 $s_\ell = $ 1 次:得到 $s = $ 2313113113111311311131131。
-
第 4 步:ℓ=5=x,因此停止。
该过程结束时,s 的长度为 25。
输入解题思路,AI测评打分。不知道怎么写?