using
System;
using
System.Collections.Generic;
class
GFG
{
static
int
M = 20;
static
int
[,,,]dp =
new
int
[M, 165, M, 2];
static
int
n, m;
static
int
count(
int
pos,
int
sum,
int
rem,
int
tight,
int
nonz, List<
int
> num)
{
if
(pos == num.Count)
{
if
(rem == 0 && sum == n)
return
1;
return
0;
}
if
(dp[pos,sum,rem,tight] != -1)
return
dp[pos,sum,rem,tight];
int
ans = 0;
int
limit = (tight != 0 ? 9 : num[pos]);
for
(
int
d = 0; d <= limit; d++)
{
if
(d == 0 && nonz != 0)
continue
;
int
currSum = sum + d;
int
currRem = (rem * 10 + d) % m;
int
currF = (tight != 0 || (d < num[pos])) ? 1 : 0;
ans += count(pos + 1, currSum, currRem,
currF, (nonz != 0 || d != 0) ? 1 : 0, num);
}
return
dp[pos, sum, rem, tight] = ans;
}
static
int
solve(
int
x)
{
List<
int
> num =
new
List<
int
>();
while
(x != 0)
{
num.Add(x % 10);
x /= 10;
}
num.Reverse();
for
(
int
i = 0; i < M; i++)
for
(
int
j = 0; j < 165; j++)
for
(
int
k = 0; k < M; k++)
for
(
int
l = 0; l < 2; l++)
dp[i, j, k, l] = -1;
return
count(0, 0, 0, 0, 0, num);
}
public
static
void
Main(String []args)
{
int
L = 1, R = 100;
n = 8; m = 2;
Console.Write( solve(R) - solve(L));
}
}