给出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