传送门:不要62
中文题目不做过多的解释
解题思路
用dp[i][j]表示最高位是j的长度为i的有多少种满足要求的!
比如:dp[2][6] = 8;(60,61,63,65,66,67,68,69)
这里的情况是可以包含有前导0的,比如dp[3][0]表示从0开始长度为3的情况数目!这里就包括000~099这么多的情况!
AC代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int MX = 15;
int dp[MX][MX];
void init()
{
memset(dp,0,sizeof dp);
dp[0][0] = 1;
for(int i=1;i<7;i++) //枚举一共有多少位
for(int j=0;j<=9;j++)//枚举第j位
for(int k=0;k<=9;k++)//枚举第j+1位进行判断
if(j!=4&&!(j==6&&k==2)) dp[i][j] += dp[i-1][k];
}
int solve(int n)
{
int digit[MX],len=1,ret = 0;
while(n>0){
digit[len++] = n%10;
n/=10;
}
digit[len] = 0;
for(int i=len-1;i>0;i--){
for(int j=0;j<digit[i];j++){
if(j!=4&&!(digit[i+1]==6&&j==2)) ret+=dp[i][j];
}
if(digit[i]==4||(digit[i+1]==6&&digit[i]==2)) break;
}
return ret;
}
int main()
{
int l,r;
init();
while(cin>>l>>r)
{
if(!l&&!r) break;
cout<<solve(r+1)-solve(l)<<endl;
}
return 0;
}