题意:给定一个字符串s和一个整数x,现在规定每一部做3件事情,一、移动光标l;二、将【l,len(此时字符串长度)】剪切;三、复制s[l]次到s后面,如此反复做x次。看样例应该能看明白。
思路:字符串长度应该还是很好求地,公式为:len=i+s[i]*(len-i);可是这个公式地前是你得知道s[i]是多少,否则没法求,所以可以先把字符串长度【1,x】地字符先求出来,然后套公式就行了,(一开始很怕求字符地时候复杂度会超,但仔细想想应该不会)。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int mod=1e9+7;
char s[maxn];
typedef long long ll;
int main()
{
int T;
ll x,ans;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&x);
scanf("%s",s+1);
int len=strlen(s+1);
string str=(s+1);
for(int i=0;str.size()<x;++i)//构造【1,x】的字符,我这里i从0开始的,所以后面要i+1
{
int j=1,k=str[i]-'0';
string temp=str.substr(i+1,str.size()-i+1);
while(j<k)
{
j++;
str+=temp;
}
}
ll ans=len;
for(int i=0;i<x;++i)
ans=(i+1+(str[i]-'0')*(ans-i-1)%mod+mod)%mod;
printf("%lld\n",ans%mod);
}
}