using
System;
using
System.Text;
public
class
GFG {
public
static
int
recur(
int
[, , , ] dp,
int
i,
int
j,
int
k,
int
l, StringBuilder a)
{
if
(i == a.Length) {
if
(l != 0 && k % l == 0)
return
1;
else
return
0;
}
if
(dp[i, j, k, l] != -1)
return
dp[i, j, k, l];
int
ans = 0;
if
(j == 1) {
for
(
int
digit = 0; digit <= (a[i] - 48);
digit++) {
if
(digit == (a[i] - 48))
ans += recur(dp, i + 1, 1, k + digit,
(l ^ digit), a);
else
ans += recur(dp, i + 1, 0, k + digit,
(l ^ digit), a);
}
}
else
{
for
(
int
digit = 0; digit <= 9; digit++) {
ans += recur(dp, i + 1, 0, k + digit,
(l ^ digit), a);
}
}
return
dp[i, j, k, l] = ans;
}
public
static
int
countInRange(
int
[, , , ] dp,
int
A,
int
B)
{
for
(
int
i = 0; i < 20; i++) {
for
(
int
j = 0; j < 2; j++) {
for
(
int
a = 0; a < 180; a++) {
for
(
int
b = 0; b < 16; b++) {
dp[i, j, a, b] = -1;
}
}
}
}
A--;
StringBuilder L =
new
StringBuilder(A.ToString());
StringBuilder R =
new
StringBuilder(B.ToString());
int
ans1 = recur(dp, 0, 1, 0, 0, L);
for
(
int
i = 0; i < 20; i++) {
for
(
int
j = 0; j < 2; j++) {
for
(
int
a = 0; a < 180; a++) {
for
(
int
b = 0; b < 16; b++) {
dp[i, j, a, b] = -1;
}
}
}
}
int
ans2 = recur(dp, 0, 1, 0, 0, R);
return
ans2 - ans1;
}
static
public
void
Main()
{
int
[, , , ] dp =
new
int
[20, 2, 180, 16];
int
L = 10, R = 15;
Console.WriteLine(countInRange(dp, L, R));
int
L1 = 1, R1 = 100;
Console.WriteLine(countInRange(dp, L1, R1));
}
}