传送门
题解:求1~n内出现过49的数的个数。
模板题,注意long long,代码注释戳这里
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,dp[64][2][10];
int b[64];
ll dfs(int pos,int t,int now,int lim) {
if (pos==-1) return t;
if (!lim&&~dp[pos][t][now]) return dp[pos][t][now];
int end=lim?b[pos]:9;
ll ans=0;
for (int i=0;i<=end;++i)
ans+=dfs(pos-1,t||(now==4&&i==9),i,lim&&i==end);
if (!lim) dp[pos][t][now]=ans;
return ans;
}
ll work(ll x) {
int len=0;
while (x) {
b[len++]=x%10ll;
x/=10ll;
}
return dfs(len-1,0,0,1);
}
int main() {
// freopen("hdu 3555.in","r",stdin);
memset(dp,-1,sizeof(dp));
int kase;
scanf("%d",&kase);
while (kase--) {
scanf("%lld",&n);
printf("%lld\n",work(n));
}
return 0;
}