找0~n 有多少个含有49的数直接DP
dp[i][j][k] 到第 i位 前面一位是j k是是否含有49了 随便记录一下就可以了

#include <iostream> #include<string.h> #include<stdio.h> using namespace std ; #define ll long long int dig[20]; ll dp[20][10][2]; ll dfs(int len,int now,int ok,int e) { if(len<0) return (ok==1); if(!e&&dp[len][now][ok]!=-1) return dp[len][now][ok]; int u=e?dig[len]:9; ll ans=0; for(int i=0;i<=u;i++) { if(now==4&&i==9) ans=ans+dfs(len-1,i,1,e&&(i==u)); else ans=ans+dfs(len-1,i,ok,e&&(i==u)); } if(!e) dp[len][now][ok]=ans; return ans; } ll calc(ll n) { int cnt=0; while(n) { dig[cnt++]=n%10; n=n/10; } return dfs(cnt-1,0,0,1); } int main() { memset(dp,-1,sizeof(dp)); int t; scanf("%d",&t); while(t--) { ll n; scanf("%lld",&n); printf("%lld ",calc(n)); } return 0; }