#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][1 << 10][1 << 10];
ull old[2][2][1 << 10][1 << 10];
//    follow num? , count zero? , has digit, parity digit

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(old, 0, sizeof(old));
	old[0][1][0][0] = 1LL;
	int to, nCntZero, nMaskHas, nMaskPar, ok;
	for (int size=0; size < len; ++size)
	{
		memset(cur, 0, sizeof(cur));
		for (int maskHas=0; maskHas < (1 << 10); ++maskHas)
			for (int maskPar=0; maskPar < (1 << 10); ++maskPar)
			{
				if (((maskHas|maskPar) ^ maskHas) != 0)
				{
					//printf("%d %d\n", maskHas, maskPar);
					continue;
				}

				for (int cntZero=0; cntZero < 2; ++cntZero)
				for (int follow=0; follow < 2; ++follow)
				{
					if (!old[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[nCntZero][follow & (next == to)][nMaskHas][nMaskPar] +=
							old[cntZero][follow][maskHas][maskPar];
					}
				}
			}

		/*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;
	for (int maskHas=0; maskHas < (1 << 10); ++maskHas)
		for (int maskPar=0; maskPar < (1 << 10); ++maskPar)
		{
			if (((maskHas|maskPar) ^ maskHas) != 0)	continue;

			if (!cur[1][0][maskHas][maskPar]) 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[1][0][maskHas][maskPar];
				//printf("aaand ans += %llu from %d %d %d %d\n", cur[1][0][maskHas][maskPar], 1, 0, maskHas, maskPar);
			}
		}

	return ans;
}

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

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