用记忆化搜索比较方便。
代码:
#include<iostream> #include<cstdio> using namespace std; typedef long long LL; LL a[20],f[20][15][15][2][2][2],vst[20][15][15][2][2][2]; LL DFS(LL pos,LL op,LL p2,LL p1,LL con,LL bj8,LL bj4) { if(bj8&&bj4)return 0; if(pos==0)return con; if(!op&&vst[pos][p2][p1][con][bj8][bj4])return f[pos][p2][p1][con][bj8][bj4]; LL i,lim=op?a[pos]:9,ret=0; for(i=(pos==a[0]);i<=lim;i++)ret+=DFS(pos-1,op&&(i==lim),p1,i,con||(p2==p1&&p1==i),bj8||(i==8),bj4||(i==4)); if(!op) {vst[pos][p2][p1][con][bj8][bj4]=1; f[pos][p2][p1][con][bj8][bj4]=ret; } return ret; } LL Cal(LL x) { a[0]=0; while(x){a[++a[0]]=x%10;x/=10;} return DFS(a[0],1,0,0,0,0,0); } int main() { LL L,R; cin>>L>>R; if(L==10000000000LL)cout<<Cal(R); else cout<<Cal(R)-Cal(L-1); return 0; }