题意:给一个区间,把一个区间内所有4,和62的数字给除去了
思路:用数位dp做题,dp[i][j]中的i表示第i位数,j表示当前值的数
例如:dp[2][2],代表20的值,dp[4][3]则代表3000的值
由此
我们可以推出公式dp[i][j]=dp[i-1][k]; 高位的数会等于所有低位的数之和
如遇到当前为4,或者当前为6而低位为2的时候则跳过不计数
一开始我们拿到的n我们需要将其分解开来分别存储进d[i],从高位往遍历一次d[i],若遇到4或者这次为2,前一个为6,到此后面的数都是不满足的,所以可以直接跳出循环
代码:
#include<bits/stdc++.h>
using namespace std;
int dp[20][10];
int d[100];
void init(){
dp[0][0]=1;
for(int i=1;i<=7;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++){
if(j!=4 && !(j==6 && k==2)){
dp[i][j]+=dp[i-1][k];
}
}
}
}
}
int solve(int n){
int ans=0;
int len=0;
while(n){
d[++len]=n%10;
n/=10;
}
d[len+1]=0;
for(int i=len;i>=1;i--){
for(int j=0;j<d[i];j++){
if(d[i+1]!=6 || j!=2){
ans+=dp[i][j];
}
}
if(d[i]==4 || (d[i+1]==6 && d[i]==2))
break;
}
return ans;
}
int main(){
int m,n;
init();
while(~scanf("%d %d",&n,&m) && n && m){
printf("%d\n",solve(m+1)-solve(n));
}
}