不要62
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2089
解题思路:
数位dp。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int dp[10][10];
void init(){
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int i = 1; i <= 7; i++){
for(int j = 0; j < 10; j++){//枚举第i为可能出现的数
for(int k = 0; k < 10; k++){//枚举第i-1为可能出现的数
if(j != 4 && !(j == 6 && k == 2))
dp[i][j] += dp[i-1][k];
}
}
}
}
int solve(int n){
int digit[10];
int len = 0;
while(n){
digit[++len] = n%10;
n /= 10;
}
digit[len+1] = 0;
int ans = 0 ;
for(int i = len; i > 0; i--){
for(int j = 0; j < digit[i]; j++){
if(j != 4 && !(digit[i+1] == 6 && j == 2))
ans += dp[i][j];
}
if(digit[i] == 4 || (digit[i+1] == 6 && digit[i] == 2))
break;
}
return ans;
}
int main(){
init();
int n,m;
while(scanf("%d%d",&n,&m),n+m){
printf("%d\n",solve(m+1)-solve(n));
}
return 0;
}