新姿势:前导0的处理
当有前导0的时候,0和1也是可以取到的,所以不能用俩数绝对值之差>2来判断,但是!!!
我们可以把有前导0的pre设为-2啊!那么0和1就可以取到了
reference:
https://www.luogu.org/blog/virus2017/solution-p2657
/*
reference:
Date:
2019.10.08
sol:
*/
#include
using namespace std;
#define int long long
template inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define dwn(i,a,b) for(int i=(a);i>=(b);--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define ee(i,u) for(int i=head[u];i;i=e[i].next)
int l,r,len;
int dp[15][10];
int bit[10+5];
inline int dfs(int pos,int pre,int lead,int limit){
if(pos>len)return 1;
if(dp[pos][pre]!=-1 && !limit)return dp[pos][pre];//没有最高位限制,且已经搜过了,所以有前导0的时候可以记录状态
int up=limit?bit[len-pos+1]:9;
int res=0;
rep(i,0,up){
if(abs(i-pre)<2)continue;
else if(lead && i==0)
res+=dfs(pos+1,-2,1,i==up && limit);
else
res+=dfs(pos+1,i,0,i==up && limit);
}
if(!limit && !lead)dp[pos][pre]=res;//有前导0的时候不能计入结果
return res;
}
inline int work(int x){
mem(dp,-1);
len=0;
while(x){
bit[++len]=x%10;
x/=10;
}
return dfs(1,-2,1,1);
}
#undef int
int main(){
#define int long long
#ifdef WIN32
freopen("test.txt","r",stdin);
#endif
rd(l),rd(r);
printf("%lld\n",work(r)-work(l-1));
return 0;
}