有一个长度为n(1<=n<=200000)的数字,求一个最小的数字,使得它比该数字大,且循环节为k.
前k个数字可以决定整个数字,如果构造出的数字比原数字小,考虑贪心使数字变大,即给第k个数字加上1.
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=200000+10;
int A[maxn];
int B[maxn];
int main(){
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
int n,k;
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++){
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
A[i]=c-'0';
}
for(int i=1;i<=k;i++){
B[i]=A[i];
if(i+k<=n)
B[i+k]=B[i];
}
for(int i=k+1;i<=n;i++){
if(i+k<=n)
B[i+k]=B[i];
}
int u=1;
for(int i=1;i<=n;i++){
if(A[i]>B[i]){
u=0;
break;
}
if(B[i]>A[i]){
u=1;
break;
}
}
if(u){
printf("%d\n",n);
for(int i=1;i<=n;i++)
printf("%d",B[i]);
return 0;
}
B[k]=B[k]+1;
for(int i=k;i>=1;i--){
if(B[i]>=10){
B[i]=B[i]-10;
B[i-1]++;
}
}
if(B[0]){
for(int i=0;i<=n;i++){
if(i+k<=n)
B[i+k]=B[i];
}
printf("%d\n",n+1);
for(int i=0;i<=n;i++)
printf("%d",B[i]);
}
else {
for(int i=1;i<=n;i++){
if(i+k<=n)
B[i+k]=B[i];
}
printf("%d\n",n);
for(int i=1;i<=n;i++)
printf("%d",B[i]);
}
return 0;
}