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