套的从别人那里学的模板= =
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int dig[15];
int dp[15][10][2];
//pos表示当前的数位,pre表示前一个数位上的数
//sta表示前面是否存在非0的数,limit表示当前的数是否受限于前一个数位上的数
int dfs(int pos, int pre, int sta, int limit)
{
//cout << "pos = " << pos << endl;
if (pos < 0)
return 1;
//cout << " val = " << endl;
if (!limit && dp[pos][pre][sta] != -1)
return dp[pos][pre][sta];
int val;
if (limit)
val = dig[pos];
else
val = 9;
int res = 0;
//cout << " val = " << val << endl;
for (int i = 0; i <= val; ++i)
{
if (sta == 0 || abs(double(i - pre)) >= 2)
res += dfs(pos - 1, i, sta || i, (!limit || (i != val)) ? 0 : 1);
}
if (!limit)
dp[pos][pre][sta] = res;
return res;
}
int solve(int n)
{
memset(dig, 0, sizeof(dig));
int cnt = 0;
while (n)
{
dig[cnt++] = n % 10;
n /= 10;
}
return dfs(cnt - 1, 0, 0, 1);
}
int main()
{
int a, b;
while (scanf("%d%d", &a, &b) != EOF)
{
memset(dp, -1, sizeof(dp));
//cout << solve(3) << endl;
printf("%d\n", solve(b) - solve(a - 1));
}
return 0;
}