题目
做法
一眼题系列打半天结果循环写反了
套路:
(1、)预处理(dp[i][j])第(i)位为(j)的方案数
(2、Solve(r)-Solve(l-1))
(~~~~)(高位不动处理低位,最高位(1)~(x-1),前导(0)情况)
My complete code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL l,r;
LL dp[15][10],a[15];
inline void Calc(){
for(LL i=0;i<=9;++i) dp[1][i]=1;
for(LL i=2;i<=10;++i)
for(LL j=0;j<=9;++j)
for(LL k=0;k<=9;++k)
if(abs(j-k)>=2)
dp[i][j]+=dp[i-1][k];
}
inline LL Solve(LL x){
LL len(0),tmp(x),ret(0);
while(tmp) a[++len]=tmp%10,tmp/=10;
for(LL i=len-1;i>=1;--i){
for(LL j=0;j<a[i];++j)
if(abs(j-a[i+1])>=2)
ret+=dp[i][j];
if(abs(a[i]-a[i+1])<2) break;
}
for(LL i=1;i<a[len];++i) ret+=dp[len][i];
for(LL i=1;i<len;++i)
for(LL j=1;j<=9;++j)
ret+=dp[i][j];
return ret;
}
int main(){
Calc();
scanf("%lld%lld",&l,&r);
printf("%lld",Solve(r+1)-Solve(l));
return 0;
}