AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1026
【题解】
这题类似于hdu2089,但是这题不能出现前导零,注意处理这点。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
int f[11][11],digit[11];
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
void pre()
{
for(int i=0;i<=9;i++) f[1][i]=1;
for(int i=2;i<=10;i++)
for(int j=0;j<=9;j++)
for(int k=0;k<=9;k++)
if(abs(j-k)>=2) f[i][j]+=f[i-1][k];
}
int ask(int x)
{
int len=0,ans=0;
while(x) {digit[++len]=x%10; x/=10;}
for(int i=1;i<len;i++)
for(int j=1;j<=9;j++)
ans+=f[i][j];
for(int i=1;i<digit[len];i++) ans+=f[len][i];
for(int i=len-1;i;i--)
{
for(int j=0;j<digit[i];j++) if(abs(j-digit[i+1])>=2) ans+=f[i][j];
if(abs(digit[i]-digit[i+1])<2) break;
}
return ans;
}
int main()
{
//freopen("cin.in","r",stdin);
//freopen("cout.out","w",stdout);
int l=read(),r=read();
pre();
printf("%d\n",ask(r+1)-ask(l));
return 0;
}