Codeforces Round #607 (Div. 2) C. Cut and Paste

题目链接:https://codeforces.com/contest/1281/problem/C

题目很长而且还看不懂:)

照着样例推结论把:)

 

t个样例,每个样例给个x,再给个字符串s。

表示i从1到x,每次将k个相同的字符串str,加到s末尾,k=s[i]-'0',str为s[i+1]到末尾的字符串。

问执行x次后的字符串长度,需取mod。

 

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
const int mod=1e9+7; 
char s[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int x;
        scanf("%d%s",&x,s+1);
        int n=strlen(s+1);
        for(int i=1,j=n;j<=x;i++)//需要复制s[i+1]到s[j],复制s[i]遍 
        {
            bool flag=false;
            for(int r=1;r<s[i]-'0';r++)//需要重复r次 
            {
                for(int t=i+1;t<=j;t++)
                {
                    if(t+(j-i)*r>x)//只需要记录到s[x] 
                    {
                        flag=true;
                        break;
                    }
                    s[t+(j-i)*r]=s[t];
                }
            }
            if(flag)break;
            j=(j-i)*(s[i]-'0')+i;//更新j 
        }
        //模拟出所有s[i] 
        long long len=n;
        for(int i=1;i<=x;i++)
        {
            len--;
            len=len*(s[i]-'0')%mod;//比记录所有len要巧妙 
        }
        printf("%lld\n",((len+x)%mod+mod)%mod);
    }
    return 0;
} 
posted @ 2019-12-21 18:40  myrtle  阅读(129)  评论(0编辑  收藏  举报