题意:给区间[a,b],求其中有多少个数不包含‘4’且不包含‘62’,1<a,b<=10^15;
数位DP求解,dp[i][j]代表,i位数以j开头的数的情况
比如dp[2][6]代表60,61,62,63,65,66,67,68,69;
dp[i][j] = dp[i][j] + dp[i-1][k],其中0<=k<=9;
#include <algorithm>
#include <iostream>
using namespace std;
int dp[10][10];
void init(){
dp[0][0] = 1;//dp[0][1-9] = 1都可以
for(int i = 1; i <= 8; 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 d[10];
int len = 0;
while(n > 0){
d[++len] = n%10;
n /= 10;
}
d[len + 1] = 0;
int ans = 0;
for(int i = len; i >= 1; i--){
for(int j = 0; j < d[i]; j++){
if(j != 4 && !(d[i+1] == 6 && j == 2)) ans += dp[i][j];
}
if(d[i] == 4 || (d[i] == 2 && d[i+1] == 6)) break;
}
return ans;
}
int main()
{
#ifdef xxz
//freopen("in.txt","r",stdin);
#endif // xxz
int r, l;
init();
while(cin>>l>>r){
if(r + l == 0) break;
cout<<solve(r+1) - solve(l)<<endl;
}
return 0;
}