#include <cstdio>
#include <cstring>

typedef unsigned long long ull;

ull l , r;
int a[32];
int can;

ull dp[32][2][2][1 << 5][1 << 10];
int u[32][2][2][1 << 5][1 << 10];

void read() {
	scanf ( "%llu%llu" , &l , &r );
}

ull go ( int left , int up , int zero , int can , int mask ) {
	if ( !left ) {
		if ( zero ) {
			for (int i = 0; i < 10; i++) {
				if ( i & 1 ) {
					if ( mask & (1 << i) ) return 0;
				} else {
					if ( can & (1 << (i / 2)) ) {
						if ( !(mask & (1 << i)) )
							return 0;
					} else
						if ( mask & (1 << i) )
							return 0;
				}
			}
// 			printf ( "             %d %d %d %d %d\n" , left , up , zero , can , mask );
			return 1;
		}
			
		return 0;
	}
	
	ull &ans = dp[left][up][zero][can][mask];
	if ( u[left][up][zero][can][mask] )
		return ans;
	u[left][up][zero][can][mask] = 1;
	
	ans = 0;
	int i , l;
	
	if ( !zero ) 
		ans += go ( left - 1 , 0 , zero , can , mask );
	
	if ( up ) 
		l = a[left - 1];
	else
		l = 9;
	
	for (i = !zero; i <= l; i++) {
		if ( (i & 1) || (can & (1 << (i / 2))) )
			ans += go ( left - 1 , up & (i == l) , 1 , can , mask ^ (1 << i) );
	}
	
// 	printf ( "%d %d %d %d %d      %llu\n" , left , up , zero , can , mask , ans );
	
	return ans;
}

ull solve ( ull bound ) {
	ull ans = 0;
	int i , n;
	
	memset ( u , 0 , sizeof u );
	
	for (i = 0; bound; i++) {
		a[i] = bound % 10;
		bound /= 10;
	}
	n = i;
	
	for (can = 0; can < (1 << 5); can++)
		ans += go ( n , 1 , 0 , can , 0 );
	
	return ans;
}

int main() {
// 	printf ( "%llu\n" , solve ( 10 ) );
// 	return 0;
	
	read();
	printf ( "%llu\n" , solve ( r ) - solve ( l - 1 ) );
	
	return 0;
}
