资料参考:http://wenku.baidu.com/link?url=o3ER_gVCyB0qcKthM-Y8vPtAGZ_u5bzOu_gUCUhPcXC6YfaSDgtBSXNEEvvGvSzyuDE9TULcPNsDrRd9IUtQVHeKUVrnPUjyfWjCly_J7Xq
博客:http://blog.csdn.net/wangyuquanliuli/article/details/13761661
针对:一类与数位有关的区间统计问题
一、HDU2089
#include<cstdio>
#include<cstring>
using namespace std;
int N, M;
int cnt;
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;
int ans = 0;
while(n > 0){
digit[++len] = n % 10;
n /= 10;
}
digit[len + 1] = 0;
for(int i = len ; i > 0 ; --i){
for(int j = 0; j < digit[i]; ++j){
if(j != 4 && !(j == 2 && digit[i + 1] == 6))
ans = ans + dp[i][j];
}
//如 2480 = 2000 + 400 + 80, 所以400+下面不用算了
if(digit[i] == 4 || (digit[i] == 2 && digit[i + 1] == 6))
break;
}
return ans;
}
int main(void){
init();
while(scanf("%d%d", &N, &M) == 2 && ( N || M)){
printf("%d\n", solve(M + 1) - solve(N));
}
return 0;
}