#include <cstdio>
#define min(a, b) (((a)<(b))?(a):(b))
#define max(a, b) (((b)<(a))?(a):(b))
typedef unsigned long long ui64_t;
typedef unsigned int ui32_t;
ui32_t DigitsCount[10], TotalDigits;
ui64_t Pow10[20]={1};
ui64_t Count(ui64_t Min, ui64_t Max, ui32_t Left){
    if(Left==0) return 1;
    ui32_t Digit;
    ui64_t Res=0;
    Left--;
    for(Digit=Min/Pow10[Left];Digit<=Max/Pow10[Left]&&Digit<=9;Digit++){
        if(DigitsCount[Digit]==0) continue;
        DigitsCount[Digit]--;
        Res+=Count(Min%Pow10[Left], Max%Pow10[Left], Left);
        DigitsCount[Digit]++;
    }
    return Res;
}
ui64_t CountBalanced(ui64_t DigitToDo, ui64_t DigitsLeft, ui64_t Min, ui64_t Max){
    if(DigitToDo==10){
        if(DigitsLeft==0) return Count(max(Min, Pow10[TotalDigits-1]), min(Max, Pow10[TotalDigits]-1), TotalDigits);
        else return 0;
    }
    ui32_t i;
    ui64_t Res=0;
    if(DigitToDo%2==0){
        DigitsCount[DigitToDo]=0;
        Res+=CountBalanced(DigitToDo+1, DigitsLeft, Min, Max);
        for(i=1;i<=DigitsLeft;i+=2){
            DigitsCount[DigitToDo]=i;
            TotalDigits+=i;
            Res+=CountBalanced(DigitToDo+1, DigitsLeft-i, Min, Max);
            TotalDigits-=i;
        }
    }else{
        for(i=0;i<=DigitsLeft;i+=2){
            DigitsCount[DigitToDo]=i;
            TotalDigits+=i;
            Res+=CountBalanced(DigitToDo+1, DigitsLeft-i, Min, Max);
            TotalDigits-=i;
        }
    }
    return Res;
}
ui32_t i, j, k;
ui64_t Min, Max;
int main(){
    for(i=1;i<=19;i++) Pow10[i]=Pow10[i-1]*10;
    scanf("%llu %llu", &Min, &Max);
    ui64_t Res=0;
    for(j=0;Pow10[j]<=Min;j++);
    for(k=0;Pow10[k]<=Max;k++);
    for(i=j;i<=k;i++){
        Res+=CountBalanced(0, i, Min, Max);
    }
    printf("%llu\n", Res);
    return 0;
}
