挺水的一道数位dp
我们只需要考虑上一位是不是6,是六的话当前位就不能填2,然后4直接跳过,记搜一发就好了
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int num[10],f[10][10];
inline int dfs(int p,int la,bool jud)
{
if (!p) return 1;
if (!jud&&f[p][la]!=-1) return f[p][la];
int emm=jud?num[p]:9,ans=0;
for (int i=0;i<=emm;i++)
{
if (i==4) continue;
if (la==6&&i==2) continue;
if (jud) ans+=dfs(p-1,i,jud&&(i==emm));
else ans+=dfs(p-1,i,0);
}
if (!jud) f[p][la]=ans;
return ans;
}
inline int slove(int a,int b)
{
int len=0;
memset(f,-1,sizeof(f));
while (a) num[++len]=a%10,a/=10;
int ans=dfs(len,0,1);
int lon=0;
memset(f,-1,sizeof(f));
while (b) num[++lon]=b%10,b/=10;
int que=dfs(lon,0,1);
return ans-que;
}
signed main()
{
int l,r;
while (~scanf("%d%d",&l,&r)&&l&&r) cout<<slove(r,l-1)<<endl;
return 0;
}