#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
#define POS 10
#define TIGHT 2
#define NUM_369 10
int dp[POS][TIGHT][NUM_369];
vector<int> NumToDigits(int n)
{
vector<int> digits;
while (n > 0)
{
digits.push_back(n % 10);
n /= 10;
}
reverse(digits.begin(), digits.end());
return digits;
}
// Digit DP function
int DigitDP(const vector<int>& digits, int pos, bool tight, int count)
{
if (pos == digits.size())
return count;
if (dp[pos][tight][count] != -1)
return dp[pos][tight][count];
int limit = tight ? digits[pos] : 9;
int total = 0;
for (int i = 0; i <= limit; ++i)
{
int currentCount = count;
if (i == 3 || i == 6 || i == 9)
++currentCount;
total += DigitDP(digits, pos + 1, tight && (i == limit), currentCount);
}
dp[pos][tight][count] = total; // save data to avoid re-calculate
return total;
}
// Count total 3-6-9 digits from 1 to n
int CountClaps(int n)
{
if (n <= 0)
return 0;
vector<int> digits = NumToDigits(n);
memset(dp, -1, sizeof(dp));
return DigitDP(digits, 0, true, 0);
}
int main()
{
int a, b;
cin >> a >> b;
if (a < 1 || b > 100000000)
return -1;
if (b < a)
swap(a, b);
cout << CountClaps(b) - CountClaps(a - 1) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIFBPUyAgICAgMTAKI2RlZmluZSBUSUdIVCAgIDIKI2RlZmluZSBOVU1fMzY5IDEwCgppbnQgZHBbUE9TXVtUSUdIVF1bTlVNXzM2OV07Cgp2ZWN0b3I8aW50PiBOdW1Ub0RpZ2l0cyhpbnQgbikgCnsKICAgIHZlY3RvcjxpbnQ+IGRpZ2l0czsKICAgIHdoaWxlIChuID4gMCkgCiAgICB7CiAgICAgICAgZGlnaXRzLnB1c2hfYmFjayhuICUgMTApOwogICAgICAgIG4gLz0gMTA7CiAgICB9CiAgICByZXZlcnNlKGRpZ2l0cy5iZWdpbigpLCBkaWdpdHMuZW5kKCkpOwogICAgcmV0dXJuIGRpZ2l0czsKfQoKLy8gRGlnaXQgRFAgZnVuY3Rpb24KaW50IERpZ2l0RFAoY29uc3QgdmVjdG9yPGludD4mIGRpZ2l0cywgaW50IHBvcywgYm9vbCB0aWdodCwgaW50IGNvdW50KSAKewogICAgaWYgKHBvcyA9PSBkaWdpdHMuc2l6ZSgpKSAKICAgICAgICByZXR1cm4gY291bnQ7CgogICAgaWYgKGRwW3Bvc11bdGlnaHRdW2NvdW50XSAhPSAtMSkKICAgICAgICByZXR1cm4gZHBbcG9zXVt0aWdodF1bY291bnRdOwoKICAgIGludCBsaW1pdCA9IHRpZ2h0ID8gZGlnaXRzW3Bvc10gOiA5OwogICAgaW50IHRvdGFsID0gMDsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8PSBsaW1pdDsgKytpKSAKICAgIHsKICAgICAgICBpbnQgY3VycmVudENvdW50ID0gY291bnQ7CiAgICAgICAgaWYgKGkgPT0gMyB8fCBpID09IDYgfHwgaSA9PSA5KQogICAgICAgICAgICArK2N1cnJlbnRDb3VudDsKICAgICAgICB0b3RhbCArPSBEaWdpdERQKGRpZ2l0cywgcG9zICsgMSwgdGlnaHQgJiYgKGkgPT0gbGltaXQpLCBjdXJyZW50Q291bnQpOwogICAgfQoKICAgIGRwW3Bvc11bdGlnaHRdW2NvdW50XSA9IHRvdGFsOyAgLy8gc2F2ZSBkYXRhIHRvIGF2b2lkIHJlLWNhbGN1bGF0ZQogICAgcmV0dXJuIHRvdGFsOwp9CgovLyBDb3VudCB0b3RhbCAzLTYtOSBkaWdpdHMgZnJvbSAxIHRvIG4KaW50IENvdW50Q2xhcHMoaW50IG4pIAp7CiAgICBpZiAobiA8PSAwKSAKICAgICAgICByZXR1cm4gMDsKICAgIHZlY3RvcjxpbnQ+IGRpZ2l0cyA9IE51bVRvRGlnaXRzKG4pOwogICAgbWVtc2V0KGRwLCAtMSwgc2l6ZW9mKGRwKSk7CiAgICByZXR1cm4gRGlnaXREUChkaWdpdHMsIDAsIHRydWUsIDApOwp9CgppbnQgbWFpbigpCnsKICAgIGludCBhLCBiOwogICAgY2luID4+IGEgPj4gYjsKCiAgICBpZiAoYSA8IDEgfHwgYiA+IDEwMDAwMDAwMCkKICAgICAgICByZXR1cm4gLTE7CgogICAgaWYgKGIgPCBhKQogICAgICAgIHN3YXAoYSwgYik7CgogICAgY291dCA8PCBDb3VudENsYXBzKGIpIC0gQ291bnRDbGFwcyhhIC0gMSkgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9Cg==