using
System;
public
class
GFG {
static
int
[, , ] dp =
new
int
[100001, 2, 16];
static
int
recur(
int
i,
int
j,
int
k,
int
T,
string
a)
{
if
(i == a.Length)
{
if
(k == T) {
return
1;
}
else
{
return
0;
}
}
if
(dp[i, j, k] != -1) {
return
dp[i, j, k];
}
int
ans = 0;
if
(j == 1)
{
for
(
int
digit = 0; digit <= (a[i] -
'0'
);
digit++)
{
if
(digit == (a[i] -
'0'
))
{
ans += recur(i + 1, 1, k | digit, T, a);
}
else
if
(digit != 0)
{
ans += recur(i + 1, 0, k | digit, T, a);
}
else
{
ans += recur(i + 1, 0, k | digit, T, a);
}
}
}
else
{
for
(
int
digit = 0; digit <= 9; digit++) {
ans += recur(i + 1, 0, k | digit, T, a);
}
}
return
dp[i, j, k] = ans;
}
static
int
countInRange(
int
K,
int
A,
int
B)
{
for
(
int
i = 0; i < dp.GetLength(0); i++) {
for
(
int
j = 0; j < dp.GetLength(1); j++) {
for
(
int
k = 0; k < dp.GetLength(2); k++) {
dp[i, j, k] = -1;
}
}
}
A--;
string
L = A.ToString();
string
R = B.ToString();
int
ans1 = recur(0, 1, 0, K, L);
for
(
int
i = 0; i < dp.GetLength(0); i++) {
for
(
int
j = 0; j < dp.GetLength(1); j++) {
for
(
int
k = 0; k < dp.GetLength(2); k++) {
dp[i, j, k] = -1;
}
}
}
int
ans2 = recur(0, 1, 0, K, R);
return
ans2 - ans1;
}
static
public
void
Main()
{
int
L = 1, R = 20, K = 5;
Console.WriteLine(countInRange(K, L, R));
int
L1 = 1, R1 = 100, K1 = 5;
Console.WriteLine(countInRange(K1, L1, R1));
}
}