题目描述
Legendary Grand Math Magic Master licunchun (LGMMMl) 嫌这题代码太短了,她狠狠地 D 了出题人一番,然后改掉了题目。
LGMMMl 变出了一个很大的n位正整数a。她又变出了一个小于n的正整数k。
魔法界最强的图论魔法师 Legendary Grand Graph Magic Master Rainy7 告诉她,对于一个m位的正整数b,记它从左到右的第i位为bi。若对于所有的i≤m-k,都满足bi=bi+k,则这个数是 有魔法的。
LGMMMl 想求出 不小于a的最小的有魔法的数,但是她忙着学习魔法,于是她把问题交给了你。
输入
第一行两个正整数,分别表示n,k。
第二行一个n位的正整数,表示a。
输出
一行一个正整数,表示不小于a的最小的有魔法的数
样例输入
【样例1】 4 2 1234 【样例2】 9 3 998244353
样例输出
【样例1】 1313 【样例2】 998998998
提示
对于100%的数据,2≤n≤2×105,1≤k<n
思路
只需要重复第一段长度为k的字符串就行,若后面每段长度为k的比第一段大,则第一段需要进1
代码
#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
const ll mo=1e9+7;
int n,k,f,m;
string s;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k>>s;
//如果后面有不足k位的情况,补0
m=n%k;
if(m)
{
m=k-m;
while(m--) s+='0';
}
//分成每段长度为k的字符串,若后面有大于第一段的,则第一段需要进1
int p=0;
while(p<s.size()-k)
{
if(s.substr(0,k)>s.substr(p+k,k)) break;
else if(s.substr(0,k)<s.substr(p+k,k)) f=1;
p+=k;
}
//第一段进1
if(f)
{
p=1;
s[k-p]++;
while(s[k-p]>'9')
{
s[k-p]='0';
s[k-p-1]++;
p++;
}
}
//输出
int t=n/k;
while(t--) cout<<s.substr(0,k);
t=n%k;
p=0;
while(t--) cout<<s[p++];
return 0;
}