题意:给你个n,求0~n之间有多少个含有“49”的个数;
与hdu2089相似直接套模板,注意用__int64
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
#define ll __int64
int a[100];
ll dp[100][3];
ll dfs(int pos, int st, bool flag)
{
if(pos==0)
return st==2;
if(flag&&dp[pos][st]!=-1)
return dp[pos][st];
ll ans=0;
int u=flag?9:a[pos];
for(int i=0;i<=u;i++)
{
if(st==2||(st==1&&i==9))
ans+=dfs(pos-1,2,flag||i<u);
else if(i==4)
ans+=dfs(pos-1,1,flag||i<u);
else ans+=dfs(pos-1,0,flag||i<u);
}
if(flag) dp[pos][st]=ans;
return ans;
}
ll cal(ll n)
{
int len=0;
while(n)
{
a[++len]=n%10;
n/=10;
}
return dfs(len,0,0);
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(dp,-1,sizeof(dp));
ll n;
cin>>n;
printf("%I64d\n",cal(n));
}
return 0;
}