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; }