#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;

typedef unsigned long long ull;

ull a, b;
ull cur[2][2][2][1 << 10][1 << 10];
//ull old[2][2][1 << 10][1 << 10];
//    follow num? , count zero? , has digit, parity digit

vector<int> vec[1 << 10];

inline void add()
{
	for (int i=0; i < (1 << 10); ++i)
		for (int j=i; ; j = i & (j-1))
		{
			vec[i].push_back(j);
			if (!j) break;
		}
}

inline ull solve(ull x)
{
	vector<int> dig; dig.clear();
	if (x == 0) return 1;

	while (x)
	{
		dig.push_back(x % 10LL);
		x /= 10LL;
	}
	reverse(dig.begin(), dig.end());
	int len = dig.size();

	//printf("len = %d\n", len);

	memset(cur, 0, sizeof(cur));
	cur[1][0][1][0][0] = 1LL;
	int to, nCntZero, nMaskHas, nMaskPar, ok, maskPar;
	for (int size=0; size < len; ++size)
	{
		int blah = size&1;
		memset(cur[blah], 0, sizeof(cur[blah]));
		for (int maskHas=0; maskHas < (1 << 10); ++maskHas)
			for (int idx=0; idx < vec[maskHas].size(); ++ idx)
			{
				maskPar = vec[maskHas][idx];
				//printf("%d ", maskPar);

				for (int cntZero=0; cntZero < 2; ++cntZero)
					for (int follow=0; follow < 2; ++follow)
					{
						if (!cur[!blah][cntZero][follow][maskHas][maskPar])
							continue;
						int to = follow? dig[size] : 9;

						//printf("currently with %d %d %d %d -> %llu\n", cntZero, follow, maskHas, maskPar, old[cntZero][follow][maskHas][maskPar]);

						for (int next=0; next <= to; ++next)
						{
							nCntZero  = cntZero | (next > 0);
							nMaskHas = maskHas | (1 << next);
							nMaskPar = maskPar ^ (1 << next);
							if (!nCntZero)
								nMaskHas = maskHas,
								nMaskPar = maskPar;
							//printf("new -> %d %d \n", nMaskHas, nMaskPar);
							cur[blah][nCntZero][follow & (next == to)][nMaskHas][nMaskPar] +=
								cur[!blah][cntZero][follow][maskHas][maskPar];
						}
					}
				if (!maskPar)
					break;
			}

		/*for (int fol=0; fol < 2; ++fol)
			for (int mHas=0; mHas < (1 << 10); ++mHas)
				for (int mPar=0; mPar < (1 << 10); ++mPar)
					printf("%d %d %d : %llu\n", fol, mHas, mPar, cur[fol][mHas][mPar]);*/
		//printf("I'm over with these %d\n", size);
		//if (size+1 != len)
		//	memcpy(old, cur, sizeof(cur));
	}

	ull ans = 0LL;
	int blah = len&1;
	for (int maskHas=0; maskHas < (1 << 10); ++maskHas)
		for (int idx=0; idx < vec[maskHas].size(); ++idx)//for (int maskPar=maskHas; ; maskPar = maskHas&(maskPar-1))
		{
			//printf("%d\n", maskPar);
			maskPar = vec[maskHas][idx];
			if (!cur[!blah][1][0][maskHas][maskPar])
			{
				if (!maskPar) break;
				continue;
			}
			ok = 1;
			for (int d=0; d < 10; ++d)
				if (maskHas & (1 << d))
					if ((d + ((maskPar & (1 << d)) > 0)) % 2 == 0)
					{
						ok = 0;
						break;
					}

			if (ok)
			{
				ans += cur[!blah][1][0][maskHas][maskPar];
				//printf("aaand ans += %llu from %d %d %d %d\n", cur[1][0][maskHas][maskPar], 1, 0, maskHas, maskPar);
			}
			if (!maskPar)
				break;
		}

	return ans;
}

inline void read()
{
	scanf("%llu%llu", &a, &b);
}

int main()
{
	read();
	add();
	printf("%llu\n", solve(b+1) - solve(a));
	return 0;
}
