-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathE.cpp
54 lines (54 loc) · 1.15 KB
/
E.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <bits/stdc++.h>
#define For(i,x,y) for (i=x;i<=y;i++)
using namespace std;
int i,j,k,n,m;
int a[100],p10[20],p1[20];
inline int cal(int x) {
int s=0;
for (;x;x/=10) s+=x%10==4||x%10==7;
return s;
}
inline int xia(int x) {
int A=x%10;
if (A<3||A==5||A==8) return x+1;
if (A==3||A==6) return x+2;
if (A==4) return x+3;
int s=0;
for (;x%10==7;x/=10) s++;
if (x%10==4) return (x+3)*p10[s]+p1[s]*4;
int s1=cal(x);
int y=x+1;
if (s1==cal(y)) return y*p10[s]+p1[s]*4;
if (s1==cal(y)+1) return y*p10[s]+p1[s+1]*4;
if (s1==cal(y)-1) {
if (s) return y*p10[s]+p1[s-1]*4;
else {
for (;y%10==0;) y/=10,s++;
return (y+1)*p10[s];
}
}
}
int dfs(int x,int y) {
if (y==1) return xia(x);
int an=dfs(x/10,(x+y-1)/10-x/10+1)*10+x%10;
if (y>=100) return an;
else {
int i,k;
For(i,1,y) a[i]=cal(x+i-1);
for (k=xia(x);k<an;k=xia(k)) {
int F=0;
For(i,1,y) if (a[i]!=cal(k+i-1)) {
F=1; break;
}
if (!F) return k;
}
return an;
}
}
int main() {
p10[0]=1; For(i,1,19) p10[i]=p10[i-1]*10;
For(i,1,19) p1[i]=p1[i-1]*10+1;
scanf("%d%d",&n,&m);
printf("%d\n",dfs(n,m));
return 0;
}