首先有一个结论
对于最大的
1
0
i
≤
k
10^i\leq k
10i≤k,答案的最后i为和k相同
考虑如何证明。
我们相当于要证连续10位相等,那么个位数必须相等
下面这个程序能证明:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[20],b[20],len1,len2;
int main(){
for(int i=0;i<10;++i)
for(int j=0;j<10;++j){
if(i==j)continue;
len1=0;len2=0;
for(int k=0;k<10;++k){
a[len1++]=(i+k)%10;
b[len2++]=(j+k)%10;
}
bool flag=true;
for(int k=0;k<9;++k){
if(a[k]==9&&a[k+1]==0)continue;
if(b[k]==9&&b[k+1]==0)continue;
int num1=0,num2=0;
if((a[k]==3&&a[k+1]==4)||(a[k]==6&&a[k+1]==7))num1=1;
if((a[k]==4&&a[k+1]==5)||(a[k]==7&&a[k+1]==8))num1=-1;
if((b[k]==3&&b[k+1]==4)||(b[k]==6&&b[k+1]==7))num2=1;
if((b[k]==4&&b[k+1]==5)||(b[k]==7&&b[k+1]==8))num2=-1;
if(num1!=num2){flag=false;break;}
}
if(flag)puts("不存在的");
` }
return 0;
}
于是我们将n变小了,k变成10以内的数
接下来的解法我就copy了:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int calc(int n){
int res=0;
while(n){
if(n%10==4||n%10==7)res++;
n/=10;
}
return res;
}
int inc(int n);
int dec(int n);
int nex(int n){
int t=n%10;
if(t==0||t==1||t==2||t==5||t==8)return n+1;
if(t==3||t==6)return n+2;
if(t==4)return n+3;
if(t==7)return min(inc(n/10)*10,nex(n/10)*10+4);
t=dec(n/10);
if(~t)return min(nex(n/10)*10,t*10+4);
return nex(n/10)*10;
}
int inc(int n){
int t=n%10;
if(t<4)return n/10*10+4;
if(t==4||t==7)return inc(n/10)*10+4;
if(t>7)return min(inc(n/10)*10,nex(n/10)*10+4);
return n/10*10+7;
}
int dec(int n){
if(calc(n)==0)return -1;
int t=n%10;
if(t==4||t==7)return n+1;
return dec(n/10)*10;
}
inline int solve(int n,int k){
int nx,i;
nx=nex(n);
while(true){
for(i=0;i<k&&calc(n+i)==calc(nx+i);++i);
if(i==k)return nx;
int x=calc(n+i);
int y=calc(nx+i);
if(x<y)
for(x=y-x;x--;nx=dec(nx+i)-i);
else
for(x-=y;x--;nx=inc(nx+i)-i);
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,k;
scanf("%d%d",&n,&k);
int c0=0,t=0;
int b=1;
while(k>=10){
t=t+b*(n%10);
b*=10;
if(n%10==0)c0++;
else c0=0;
int now=k/10;
if(k%10)now++;
int tmp=k%10-1;
if(tmp<0)tmp+=10;
if(n%10+tmp>=10)now++;
k=now;
n/=10;
}
printf("%d",solve(n,k));
while(c0--)putchar('0');
if(t)printf("%d",t);
puts("");
}
return 0;
}