/*
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 ALL = 1 << 16;
const int EMPTY = 59048;
const int pow3[] = { 1 , 3 , 9 , 27 , 81 , 243 , 243 * 3 , 243 * 9 , 243 * 27 , 243 * 81 , 243 * 243 , 243 * 243 * 3 , 243 * 243 * 9 };

/**
 * dp[pos][mod][zero][edge]
 */ 

int A,B;

int maxdig[MAXL];
int dp[MAXL][ALL][2][2];

int prepare( int 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 <= 9 ; i++ ){
        mask += pow3[i] * arr[i];
    }
    return mask;
}

int get( int pos , int mask , int zero , int edge ){
    int arr[MAXL];
    memset( arr , 0 , sizeof( arr ) );
    decode( mask , arr );
    
    if( pos == 0 ){
        int flag = 1;
        for( int i = 0 ; i <= 9 ; i++ ){
            if( arr[i] == 2 ) continue;
            if( i % 2 == arr[i] % 2 ){
                flag = 0;
                break;
            }
        }
        //eprintf("OK for %d", mask);
        return flag;
    }
    
    int &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 old = arr[i];
        if( arr[i] == 2 ) arr[i] = 1;
        else if( arr[i] == 1 ) arr[i] = 0;
        else if( arr[i] == 0 ) arr[i] = 1;
        self += get( pos - 1 , encode( arr ) , 1 , ( edge and to == i ) );
        arr[i] = old;
    }
    
    return self;
}

int test(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 == 1 ){
            eprintf("#%d is %d", cnt, i);
        
         cnt++;
        }
    }
    return cnt;
}

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

int main(){
	//freopen( "balanced.in" , "r" , stdin );
	//freopen( "balanced.out" , "w" , stdout );
	
	///scanf("%d %d", &A, &B);
	
	///cout << test(B) - test(A-1) << endl;
	
	/// the starting mask is 10101010101 blah blah
	
	
	///cout << solve( 1000 ) << endl;
	
	int a,b;
	scanf("%d %d", &a, &b);
	
	cout << solve( b ) - solve( a - 1 ) << endl;
	
	return 0;
}
