给出a、b两个区间,求所有不含有4或62(62连号)的数字的个数。
AC代码:

1 #include<string.h>
2 #include<iostream>
3 #include<stdio.h>
4 #include<algorithm>
5 #include<queue>
6 #include<vector>
7 #include<map>
8 #include<cmath>
9 using namespace std;
10 #define inf 0x3f3f3f3f
11 const int N=50;
12 typedef long long ll;
13
14 int digit[25];
15 ll dp[N][2];
16
17 ll dfs(int len,bool if6,bool limit)
18 {
19 if(len==0)
20 return 1;
21 if(limit==0&&dp[len][if6])
22 return dp[len][if6];
23 ll cnt=0,up;
24 if(limit==1)
25 up=digit[len];
26 else
27 up=9;
28 for(int i=0; i<=up; i++)
29 {
30 if(if6&&i==2)//不要62
31 continue;
32 if(i==4)//不要4
33 continue;
34 cnt+=dfs(len-1,i==6,limit&&i==up);
35 }
36 if(limit==0)
37 dp[len][if6]=cnt;
38 return cnt;
39 }
40
41 ll solve(ll x)
42 {
43 int num=0;
44 while(x)
45 {
46 digit[++num]=x%10;
47 x/=10;
48 }
49 return dfs(num,0,1);
50 }
51
52 int main()
53 {
54 ll n,m;
55 while(cin>>n>>m)
56 {
57 if(n==0&&m==0)
58 break;
59 memset(dp,0,sizeof(dp));
60 cout<<solve(m)-solve(n-1)<<endl;
61 }
62 return 0;
63 }
来源:https://www.cnblogs.com/OFSHK/p/12262117.html
