#include using namespace std; vector can; int many; long long mem[30][2][2]; long long ret(int poz, int equal, int some, vector d) { if(mem[poz][equal][some] >= 0) return mem[poz][equal][some]; long long &ans = mem[poz][equal][some]; ans = 0; if(poz == int(d.size())) { if(some) return ans = 1; return 0; } for(auto c : can) { if(equal) { if(c > d[poz]) continue; if(c == d[poz]) ans += ret(poz + 1, 1, 1, d); else ans += ret(poz + 1, 0, 1, d); } else { ans += ret(poz + 1, 0, 1, d); } } if(some == 0) ans += ret(poz + 1, 0, 0, d); return ans; } long long solve(long long n) { if(n == 0) return 0LL; vector d; while(n) { d.push_back(n % 10); n /= 10; } reverse(d.begin(), d.end()); memset(mem, -1, sizeof(mem)); return ret(0, 1, 0, d); } int brut(int a, int b) { int ans = 0; for(int i = a; i < b; ++i) { int temp = i; bool bad = false; while(temp > 0) { if(temp % 10 < a) bad = true; temp /= 10; } if(not bad) ans++; } return ans; } int main() { long long a, b; cin >> a >> b; if(a >= 10) { cout << 0 << "\n"; return 0; } for(int i = 1; i <= 9; ++i) if(i >= a) can.push_back(i); many = can.size(); long long ans = solve(b - 1) - solve(a - 1); cout << ans << "\n"; }