/*
TASK: balanced
LANG: C++
*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>

#define pb push_back

using namespace std;

typedef long long ll;

ll a, b;
ll dp[32][60010];
int pow[16];
ll cntLen[32];

int len(ll x)
{
    int ret = 0;
    while(x)
    {
        ret ++;
        x /= 10;
    }
    return ret;
}

void init()
{
    cin >> a >> b;

    pow[0] = 1;
    for(int i = 1; i <= 10; i ++) pow[i] = pow[i - 1] * 3;
}

int get(int mask, int dig) { return (mask / pow[dig]) % 3; }

bool valid(int mask)
{
    for(int i = 0; i <= 9; i ++)
    {
        int tmp = get(mask, i);
        if(tmp == 0) continue;
        if(i % 2 == tmp % 2) return false;
    }
    return true;
}

int combine(int mask1, int mask2)
{
    for(int i = 0; i < 10; i ++)
    {
        int u1 = get(mask1, i);
        int u2 = get(mask2, i);

        if(u1 == 0 && u2 == 0) continue;
        if((u1 + u2) % 2)
        {
            if(u1 == 0) mask1 += pow[i];
            if(u1 == 2) mask1 -= pow[i];
        }
        else
        {
            mask1 += (2 - u1) * pow[i];
        }
    }

    return mask1;
}

void compute(int lim)
{
    dp[0][0] = 1;
    for(int i = 1; i <= 9; i ++)
        dp[1][ pow[i] ] = 1;

    for(int i = 1; i < lim; i ++)
        for(int mask = 0; mask < pow[10]; mask ++)
            if(dp[i][mask])
                for(int j = 0; j <= 9; j ++)
                {
                    int tmp = get(mask, j);
                    if(tmp != 2) dp[i + 1][ mask + pow[j] ] += dp[i][mask];
                    else dp[i + 1][ mask - pow[j] ] += dp[i][mask];
                }

    cntLen[0] = 1;
    for(int i = 1; i <= lim; i ++)
        for(int mask = 0; mask < pow[10]; mask ++)
            if(dp[i][mask] && valid(mask))
                cntLen[i] += dp[i][mask];
}

ll add(int mask, int dig, int sz)
{
    //cout << mask << " " << dig << " " << sz << endl;
    //cout << "dokladvai:\n";

    int u = get(mask, dig);
    if(u != 2) mask += pow[dig];
    else mask -= pow[dig];

    //cout << mask << " " << dig << " " << sz << endl;
    //cout << endl;

    ll ret = 0;

    for(int i = 0; i < pow[10]; i ++)
        if(dp[sz][i] && valid( combine(mask, i) ))
        {
            //cout << combine(mask, i) << endl;
            ret += dp[sz][i];
            //cout << i << " " << dp[sz][i] << endl;
        }

    for(int br = 1; br <= sz; br ++)
    {
        int m2 = mask;
        if(br % 2) m2 ++;
        else m2 += 2;

        //cout << m2 << endl;

        for(int i = 0; i < pow[10]; i ++)
            if(dp[sz - br][i] && valid( combine(m2, i) ))
            {
                //cout << combine(m2, i) << endl;
                ret += dp[sz - br][i];
                //cout << i << " " << dp[sz - br][i] << endl;
            }
    }
    //cout << ret << endl;
    //cout << endl;
    return ret;
}

ll calc(ll x)
{
    if(x == 0) return 0;

    ll ret = 0;
    int l = len(x);
    vector<int> num;

    for(int i = 1; i < l; i ++)
        ret += cntLen[i];

    while(x)
    {
        num.pb(x % 10);
        x /= 10;
    }
    reverse(num.begin(), num.end());

    int maskTmp = 0;
    for(int i = 0; i < num.size(); i ++)
    {
        for(int j = 1 - (i != 0); j < num[i]; j ++)
            ret += add(maskTmp, j, num.size() - i - 1);

        int u = get(maskTmp, num[i]);
        if(u != 2) maskTmp += pow[ num[i] ];
        else maskTmp -= pow[ num[i] ];
    }
    if(valid(maskTmp)) ret ++;
    return ret;
}

int main()
{
    init();
    compute(len(b));
    cout << calc(b) - calc(a - 1) << endl;

    return 0;
}
