/*
PROB: balanced
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <numeric>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <ctime>
#include <cmath>
#include <cstdlib>
#define foreach(a,b) for( typeof((b).begin()) a = (b).begin() ; a != (b).end() ; a++ )
#define eprintf( msg , ... ) 0///fprintf( stderr , "Line %d in %s :: " msg "\n" , __LINE__ , __FUNCTION__ , ##__VA_ARGS__ )

using namespace std;

typedef long long ll;

const int MAXL = 10;
const int DIGITS = 10;
const int MAXDIGIT = 9;
const int EMPTY = 59048;
const int ALL = EMPTY + 2;

ll pow3[200];
int maxdig[MAXL];
ll dp[MAXL][ALL][2][2];

int prepare( ll n ){
    memset( maxdig , 0 , sizeof(maxdig) );
    
    int at = 0;
    
    while( n ){
        maxdig[at++] = n % 10;
        n/=10;
    }
    
    return at;
}

inline void decode( int mask , int arr[] ){
    int at = 0;
    while( mask ){
        arr[at++] = mask % 3;
        mask /= 3;
    }
}

inline int encode( int arr[] ){
    int mask = 0;
    for( int i = 0 ; i <= MAXDIGIT ; i++ ){
        mask += pow3[i] * arr[i];
    }
    return mask;
}

inline int getdig( int mask , int dig ){
    /// 1143 -> get 4
    /// 1143 -> 114 % 10 -> 4
    return (mask / pow3[dig]) % 3;
}

inline int setdig( int mask , int dig , int val ){
    /// 1143 -> set 4 to 5
    /// 114 -> 110 -> 115*pow10[1] + (1143%10) = 
    int newmask = mask / pow3[dig];
    newmask -= newmask % 3;
    newmask += val;
    return ( newmask * pow3[dig] ) + ( mask % pow3[dig] );
}

ll get( int pos , int mask , int zero , int edge ){
    if( pos == 0 ){
        int flag = 1;
        for( int i = 0 ; i <= 9 ; i++ ){
            if( getdig(mask,i) == 2 ) continue;
            if( i % 2 == getdig(mask,i) % 2 ){
                flag = 0;
                break;
            }
        }
        return flag;
    }
    
    ll &self = dp[pos][mask][zero][edge];
    
    if( self != -1 )
        return self;
    
    int from = (zero^1);
    int to = ( edge ? maxdig[pos-1] : 9 );
    
    self = 0;
    
    for( int i = from ; i <= to ; i++ ){
        /*
        int newmask = 0;
        if( arr[i] == 2 ) arr[i] = 1;
        else if( arr[i] == 1 ) arr[i] = 0;
        else if( arr[i] == 0 ) arr[i] = 1;
        */
        int old = getdig(mask,i);
        int newmask = 0;
        if( old == 2 or old == 0 )
            newmask = setdig(mask,i,1);
        else
            newmask = setdig(mask,i,0);
        self += get( pos - 1 , newmask , 1 , ( edge and to == i ) );
    }
    
    return self;
}


int check(int n){
    int cnt = 0;
    for( int i = 1 ; i <= n ; i++ ){
        int k = i;
        int cnts[10];
        memset( cnts , -1 , sizeof( cnts ) );
        while( k ){
            if( cnts[k%10] == -1 ) cnts[k%10] = 0;
            cnts[k%10]++;
            k /= 10;
        }
        int flag = 1;
        for( int i = 0 ; i < 10 ; i++ ){
            if( (cnts[i] != -1) and (cnts[i]%2) == i % 2 ) flag = 0;
        }
        if( flag )
            cnt++;
    }
    return cnt;
}


ll solve( ll n ){
    memset( dp , -1 , sizeof( dp ) );
    int dig = prepare( n );
    
    ll res = 0;
    
    for( int i = 1 ; i <= dig ; i++ ){
        ///eprintf("%d digit numbers -> %d", get( i , EMPTY , 0 , 1 ) );
        res += get( i , EMPTY , 0 , ( i >= dig )  );
    }
    
    return res;
}


int test(){
    int a = 1000;
    int b = rand() % 10000 + a;
    int slow = check(b) - check(a-1);
    int fast = solve( b ) - solve( a-1 );
    if( slow == fast )
        printf("OK %d %d\n", a,b);
    else{
        printf("WA %d %d GOT %d EXPECTED %d\n", a,b, fast,slow);
        exit(1);
    }
    return 1;
}

int main(){
	//freopen( "balanced.in" , "r" , stdin );
	//freopen( "balanced.out" , "w" , stdout );
	
	pow3[0] = 1;
	for( int i = 1 ; i <= 20 ; i++ ) pow3[i] = pow3[i-1] * 3LL;
	
	///scanf("%d %d", &A, &B);
	
	///cout << test(B) - test(A-1) << endl;
	
	/// the starting mask is 10101010101 blah blah
	
	///cout << solve( 1000 ) << endl;
	
	ll a,b;
	scanf("%lld %lld", &a, &b);
	
	eprintf("got %lld and %lld", solve(b) , solve(a-1));
	//cout << solve( b ) - solve( a - 1 ) << endl;
	
    printf("%lld\n", solve(b) - solve(a-1));
	
	//for( int i = 0 ; i <= 9 ; i++ ) printf("dig #%d -> %d\n", i, getdig(EMPTY,i));
	
	return 0;
    srand( time(NULL) );
	int at = 0;
	while( at < 1000 )
        test();
	
	//cout << 0 << endl;
	
	fprintf( stderr , "%.2lf" , (double)clock() / (double) CLOCKS_PER_SEC);
	return 0;
}
