1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include<bits/stdc++.h> using namespace std; #define ll long long int int shu[100]; ll dp[100][100]; ll dfs(ll pos,bool limit,bool zero,int last) { if(pos==-1) return 1; if(!limit&&!zero&&dp[pos][last]+1) return dp[pos][last]; int up; if(limit) up=shu[pos]; else up=9; ll tem=0; for(int i=0;i<=up;++i) { if(abs(last-i)<2) continue; if(zero&&i==0) tem+=dfs(pos-1,limit&&i==up,1,-22); else tem+=dfs(pos-1,limit&&i==up,0,i); } if(!limit&&!zero) dp[pos][last]=tem; return tem;
} ll solve(ll t) { memset(dp,-1,sizeof(dp)); int ans=0; while(t) { shu[ans++]=t%10; t/=10; } return dfs(ans-1,1,1,-2); } int main() { ll a,b; cin>>a>>b; printf("%lld",solve(b)-solve(a-1)); }
|