Description:
We start with a string s consisting only of the digits or . The length of is denoted by . For each i from to , the i-th character of is denoted by
There is one cursor. The cursor’s location ℓ is denoted by an integer in {0,…,|s|}, with the following meaning:
-
If , then the cursor is located before the first character of .
-
If , then the cursor is located right after the last character of .
-
If then the cursor is located between sℓ and .
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 , 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 , then set .
-
The Paste action. Append the value of c to the end of the string . Note that this doesn’t modify .
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 , stop. Otherwise, return to step .
You’re given the initial string s and the integer . What is the length of when the procedure stops? Since this value may be very large, only find it modulo 109+7.
It is guaranteed that at any time.
Input
The first line of input contains single integer 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 . The second line of each test case consists of the initial string . It is guaranteed, that consists of the characters .
It is guaranteed that the sum of in a single file is at most . It is guaranteed that in each test case before the procedure will stop it will be true that at any time.
Output
For each test case, output a single line containing a single integer denoting the answer for that test case modulo .
Example
input
4
5
231
7
2323
6
333
24
133321333
output
25
1438
1101
686531475
Note
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 .
-
Step 2, Cut once: we get and
-
Step 3, Paste times: we get .
-
Step 4: , so we return to step 1.
-
Step 1, Move once: we get .
-
Step 2, Cut once: we get and .
-
Step 3, Paste times: we get .
-
Step 4: , so we return to step .
-
Step 1, Move once: we get .
-
Step 2, Cut once: we get and .
-
Step 3, Paste time: we get .
-
Step 4: , so we return to step 1.
-
Step 1, Move once: we get .
-
Step 2, Cut once: we get and .
-
Step 3, Paste times: we get .
-
Step 4: , so we return to step 1.
-
Step 1, Move once: we get .
-
Step 2, Cut once: we get and .
-
Step 3, Paste times: we get .
-
Step 4: , so we stop.
At the end of the procedure, s has length .
题意: 每次分割字符串,把后面的乘以此时分割点的倍数加到后面,然后问x次操作串能到多长。 这道题我当时考虑了一下只有把原本字符串长度步数内操作完加上的字符串就够用的了,但是自己否定自己了,没敢写,所以掉分了。
AC代码:
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <stack>
#include <queue>
using namespace std;
#define sd(n) scanf("%d", &n)
#define sdd(n, m) scanf("%d%d", &n, &m)
#define sddd(n, m, k) scanf("%d%d%d", &n, &m, &k)
#define pd(n) printf("%d\n", n)
#define pc(n) printf("%c", n)
#define pdd(n, m) printf("%d %d", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n, m) printf("%lld %lld\n", n, m)
#define sld(n) scanf("%lld", &n)
#define sldd(n, m) scanf("%lld%lld", &n, &m)
#define slddd(n, m, k) scanf("%lld%lld%lld", &n, &m, &k)
#define sf(n) scanf("%lf", &n)
#define sc(n) scanf("%c", &n)
#define sff(n, m) scanf("%lf%lf", &n, &m)
#define sfff(n, m, k) scanf("%lf%lf%lf", &n, &m, &k)
#define ss(str) scanf("%s", str)
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = n; i >= a; i--)
#define mem(a, n) memset(a, n, sizeof(a))
#define debug(x) cout << #x << ": " << x << endl
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define mod(x) ((x) % MOD)
#define gcd(a, b) __gcd(a, b)
#define lowbit(x) (x & -x)
typedef pair<int, int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int MOD = 1e9 + 7;
const double eps = 1e-9;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const int inf = 0x3f3f3f3f;
inline int read()
{
int ret = 0, sgn = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
sgn = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
ret = ret * 10 + ch - '0';
ch = getchar();
}
return ret * sgn;
}
inline void Out(int a)
{
if (a > 9)
Out(a / 10);
putchar(a % 10 + '0');
}
ll gcd(ll a, ll b)
{
return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b)
{
return a * b / gcd(a, b);
}
///快速幂m^k%mod
ll qpow(int m, int k, int mod)
{
ll res = 1, t = m;
while (k)
{
if (k & 1)
res = res * t % mod;
t = t * t % mod;
k >>= 1;
}
return res;
}
// 快速幂求逆元
int Fermat(int a, int p) //费马求a关于b的逆元
{
return qpow(a, p - 2, p);
}
///扩展欧几里得
int exgcd(int a, int b, int &x, int &y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
int g = exgcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return g;
}
///使用ecgcd求a的逆元x
int mod_reverse(int a, int p)
{
int d, x, y;
d = exgcd(a, p, x, y);
if (d == 1)
return (x % p + p) % p;
else
return -1;
}
///中国剩余定理模板
ll china(int a[], int b[], int n) //a[]为除数,b[]为余数
{
int M = 1, y, x = 0;
for (int i = 0; i < n; ++i) //算出它们累乘的结果
M *= a[i];
for (int i = 0; i < n; ++i)
{
int w = M / a[i];
int tx = 0;
int t = exgcd(w, a[i], tx, y); //计算逆元
x = (x + w * (b[i] / t) * x) % M;
}
return (x + M) % M;
}
int n, t;
int res;
int main()
{
sd(t);
while (t--)
{
sd(n);
string s;
cin >> s;
int pos = 1;
while (s.size() < n)
{
int len = s.size();
for (int i = 1; i < s[pos - 1] - '0'; i++)
s += s.substr(pos, len - pos);
pos++;
}
ll ans = s.size() % MOD;
while (pos <= n)
{
res = s[pos - 1] - '0';
ans = (ans + ((ans - pos) * (res - 1)) % MOD + MOD) % MOD;
pos++;
}
cout << ans % MOD << endl;
}
return 0;
}