题目链接
题意:给你一个数,问从0到这个数x之间,含有多少个49
分析:很直接的数位dp。
dfs(len,is4,isMax):表示当前考虑第len位,上一位是不是4,然后是不是到达上限。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define cl(a,b) memset(a,b,sizeof(a))
const int maxn=205;
const int inf=1<<28;
double pi=acos(-1.0);
#define gcd __gcd
int bit[100];
LL dp[100][2];
LL dfs(int len,bool is4,bool isMax){
if(len==0)return 1;
if(!isMax&&~dp[len][is4])return dp[len][is4];
LL res=0;
int u=isMax?bit[len]:9;
for(int i=0;i<=u;i++){
if(is4&&i==9)continue;
res+=dfs(len-1,i==4,isMax&&u==i);
}
return isMax?res:dp[len][is4]=res;
}
LL f(LL x){
int len=0;
while(x){
bit[++len]=x%10;
x/=10;
}
return dfs(len,false,true);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
cl(dp,-1);
LL num;
scanf("%lld",&num);
printf("%lld\n",num-f(num)+1);
}
return 0;
}