http://acm.hdu.edu.cn/showproblem.php?pid=2089
转载自http://blog.csdn.net/acm_cxlove/article/details/7819907
n - m 的树中不含4和62的数有多少个
1 #include<iostream> 2 #include<cstring> 3 #include<queue> 4 #include<cstdio> 5 #include<cmath> 6 #include<algorithm> 7 #define N 55 8 #define inf 1<<29 9 #define MOD 9973 10 #define LL long long 11 #define eps 1e-7 12 #define zero(a) fabs(a)<eps 13 #define equal(a,b) zero(a-b) 14 using namespace std; 15 int dp[10][3]; 16 //dp[i][0],表示不存在不吉利数字 17 //dp[i][1],表示不存在不吉利数字,且最高位为2 18 //dp[i][2],表示存在不吉利数字 19 void Init(){ 20 memset(dp,0,sizeof(dp)); 21 dp[0][0]=1; 22 for(int i=1;i<=6;i++){ 23 dp[i][0]=dp[i-1][0]*9-dp[i-1][1]; //在最高位加上除了4之外的9个数字,但是可能在2之前加了6 24 dp[i][1]=dp[i-1][0]; //就是在原先不含不吉利数字的最高位加2 25 dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1]; //在已经有不吉利数字最高位加任意数字,或者在无吉利数字前加4,或者在2前面加4 26 } 27 } 28 int slove(int n){ 29 int len=0,bit[10]; 30 int tmp=n; 31 while(n){ 32 bit[++len]=n%10; 33 n/=10; 34 } 35 bit[len+1]=0; 36 int ans=0; 37 bool flag=false; 38 for(int i=len;i;i--){ 39 ans+=dp[i-1][2]*bit[i]; 40 if(flag) //高位已经出现4或者62,后面的就随意 41 ans+=dp[i-1][0]*bit[i]; 42 if(!flag&&bit[i]>4) //高位可能出现4的情况 43 ans+=dp[i-1][0]; 44 if(!flag&&bit[i+1]==6&&bit[i]>2) //高位是6,后面一位可能出现2,这步debug了很久 45 ans+=dp[i][1]; 46 if(!flag&&bit[i]>6) //高位可能出现6,要把后面最高位为2计入 47 ans+=dp[i-1][1]; 48 if(bit[i]==4||(bit[i+1]==6&&bit[i]==2)) //高位已经出现4或者62 49 flag=true; 50 } 51 return tmp-ans; 52 } 53 int main(){ 54 int l,r; 55 Init(); 56 while(scanf("%d%d",&l,&r)!=EOF&&l+r) 57 printf("%d\n",slove(r+1)-slove(l)); 58 return 0; 59 }
原文:http://www.cnblogs.com/luomi/p/5742740.html