原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089
题意不要含有连续62或4的串,数位dp入门题。
d[n][t]表示的是第n位为t的个数,b[i]是区间端点每位数,flag用于判断这一位能取到9还是只能是区间端点在该位的数(取决于上一位是否取到最大的数,即区间端点在该位的数)。
#include<cstdio>
#include<cstring>
#define mms(a) memset(a,0,sizeof(a))
using namespace std;
int d[10][10],x,cnt,b[10];
int dfs(int n,bool flag,int t)
{
if(!n) return 1;
if(!flag && d[n][t]) return d[n][t];
int ans = 0 , m = flag? b[n]:9;
for(int i = 0;i <= m;++i)
{
if(i != 4 && !(t == 6 && i == 2))
ans += dfs(n - 1,flag && i== m,i);
}
return d[n][t] = ans;
}
int solve(int x)
{
mms(b);mms(d);
for(cnt = 0;x >0 ;x /= 10) b[++cnt] = x % 10;
return dfs(cnt,true,0);
}
int main()
{
int n,m;
while(1)
{
scanf("%d%d",&n,&m);
if(n == 0 && m == 0) break;
printf("%d\n",solve(m) - solve(n-1));
}
return 0;
}