题意:给定一个区间[a,b],求[a,b]中存在子串49的数字的个数
有了上一道“不要62”的基础,这道题其实非常好写了,甚至可以把这道题当作“不要49”来做,用区间长度减去答案即可。
当然,也可以正着来。用status记录三种状态:上一位为4,出现过49,其他。
#include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define FOR(i,x,y) for(int i=(x);i<=(y);i++) #define DOR(i,x,y) for(int i=(x);i>=(y);i--) typedef long long LL; using namespace std; LL dp[23][3]; int num[23]; //status为2意思是已经出现过49,status为1意思是上一位为4 LL dfs(int k,int status,bool ismax) { if(k==0)return status==2; if(!ismax && dp[k][status]!=-1)return dp[k][status]; int maxer=ismax?num[k]:9; LL res=0; FOR(i,0,maxer) res+=dfs(k-1,status==2||status==1&&i==9?2:i==4,ismax&&i==maxer); if(!ismax)dp[k][status]=res; return res; } LL solve(LL k) { int p=0; while(k) { num[++p]=k%10; k/=10; } return dfs(p,0,1); } int main() { int T; scanf("%d",&T); memset(dp,-1,sizeof(dp)); while(T--) { LL A; scanf("%lld",&A); printf("%lld\n",solve(A)); } return 0; }