#include <bits/stdc++.h>
using
namespace
std;
int
dp[11][2][(1LL << 10) - 1][2];
int
recur(
int
i,
int
j,
int
k,
int
l, string a)
{
if
(i == a.size()) {
return
1;
}
if
(dp[i][j][k][l] != -1)
return
dp[i][j][k][l];
int
ans = 0;
if
(j == 1) {
for
(
int
digit = 0; digit <= 9; digit++) {
int
mask = (1 << digit);
if
(mask & k) {
if
(digit == ((
int
)a[i] - 48)) {
ans += recur(i + 1, 1, k - (1 << digit),
1, a);
}
else
if
(digit == 0) {
ans += recur(i + 1, 0, k, 0, a);
}
else
if
(digit < ((
int
)a[i] - 48)) {
ans += recur(i + 1, 0, k - (1 << digit),
1, a);
}
}
}
}
else
{
for
(
int
digit = 0; digit <= 9; digit++) {
int
mask = (1 << digit);
if
(mask & k) {
if
(digit == 0 and l == 0)
ans += recur(i + 1, 0, k, 0, a);
else
if
(digit == 0 and l == 1)
ans += recur(i + 1, 0, k - (1 << digit),
1, a);
else
ans += recur(i + 1, 0, k - (1 << digit),
1, a);
}
}
}
return
dp[i][j][k][l] = ans;
}
int
countInRange(
int
A,
int
B)
{
memset
(dp, -1,
sizeof
(dp));
A--;
string L = to_string(A), R = to_string(B);
int
ans1 = recur(0, 1, (1 << 10) - 1, 0, L);
memset
(dp, -1,
sizeof
(dp));
int
ans2 = recur(0, 1, (1 << 10) - 1, 0, R);
return
ans2 - ans1;
}
int
main()
{
int
L = 1, R = 100;
cout << countInRange(L, R) << endl;
return
0;
}