using
System;
class
GFG{
static
int
[,,]dp;
public
static
int
search(
int
n,
int
k,
int
z)
{
dp =
new
int
[100000 + 1, z, 2];
int
low = n + 1;
int
high =
int
.MaxValue / 2;
Clear(z);
int
left = solve(n +
""
, 0,
0, 1, z) - 1;
int
ans = -1;
while
(low <= high)
{
int
mid = low + (high - low) / 2;
Clear(z);
int
right = solve(mid +
""
, 0,
0, 1, z) - 1;
if
(left + k == right)
{
ans = mid;
high = mid - 1;
}
else
if
(left + k < right)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return
ans;
}
public
static
int
solve(String s,
int
index,
int
sum,
int
tight,
int
z)
{
if
(index >= s.Length)
{
if
(sum % z == 0)
return
1;
return
0;
}
if
(dp[index, sum, tight] != -1)
return
dp[index, sum, tight];
int
ans = 0;
if
(tight == 1)
{
int
l = s[index] -
'0'
;
for
(
int
i = 0; i <= l; i++)
{
if
(i == l)
{
ans += solve(s, index + 1,
(sum + i) % z,
1, z);
}
else
{
ans += solve(s, index + 1,
(sum + i) % z,
0, z);
}
}
}
else
{
for
(
int
i = 0; i <= 9; i++)
ans += solve(s, index + 1,
(sum + i) % z, 0,
z);
}
return
dp[index, sum, tight] = ans;
}
public
static
void
Clear(
int
z)
{
for
(
int
i = 0; i < 100001; i++)
{
for
(
int
j = 0; j < z; j++)
{
for
(
int
l = 0; l < 2; l++)
dp[i, j, l] = -1;
}
}
}
public
static
void
Main(String []args)
{
int
N = 40;
int
K = 4;
int
M = 2;
Console.WriteLine(search(N, K, M));
}
}