using
System;
class
GFG
{
static
readonly
int
M = 100;
static
int
cntNum(String X,
int
i,
int
prod,
int
K,
int
st,
int
tight,
int
[,,,]dp)
{
if
(i >= X.Length || prod > K)
{
return
prod == K ? 1 : 0;
}
if
(dp[prod, i, tight, st] != -1)
{
return
dp[prod, i, tight, st];
}
int
res = 0;
int
end = tight > 0 ? X[i] -
'0'
: 9;
for
(
int
j = 0; j <= end; j++)
{
if
(j == 0 && st == 0)
{
res += cntNum(X, i + 1, prod, K, 0,
(tight & ((j == end) ? 1 : 0)), dp);
}
else
{
res += cntNum(X, i + 1, prod * j, K, 1,
(tight & ((j == end) ? 1 : 0)), dp);
}
}
return
dp[prod, i, tight, st] = res;
}
static
int
UtilCntNumRange(
int
L,
int
R,
int
K)
{
String str = String.Join(
""
, R);
int
[,,,]dp =
new
int
[M, M, 2, 2];
for
(
int
i = 0; i < M; i++)
{
for
(
int
j = 0; j < M; j++)
{
for
(
int
k = 0; k < 2; k++)
for
(
int
l = 0; l < 2; l++)
dp[i, j, k, l] = -1;
}
}
int
cntR = cntNum(str, 0, 1, K,
0, 1, dp);
str = String.Join(
""
, L - 1);
for
(
int
i = 0; i < M; i++)
{
for
(
int
j = 0; j < M; j++)
{
for
(
int
k = 0; k < 2; k++)
for
(
int
l = 0; l < 2; l++)
dp[i, j, k, l] = -1;
}
}
int
cntL = cntNum(str, 0, 1, K,
0, 1, dp);
return
(cntR - cntL);
}
public
static
void
Main(String[] args)
{
int
L = 20, R = 10000, K = 14;
Console.Write(UtilCntNumRange(L, R, K));
}
}