C HDU 3555 Bomb

问有多少个数包含“49”


这不是和上一题(B HDU 2089 不要62)一样么。。。

直接把上一题的 62 改成 49,然后去掉 4 这个条件,没了。。

// This code Write By chtholly_micromaker(MicroMaker)
#include <bits/stdc++.h>
#define int long long
#define reg register
using namespace std;
const int MaxN=21;
template <class t> inline void rd(t &s)
{
	s=0;
	reg char c=getchar();
	while(!isdigit(c))
		c=getchar();
	while(isdigit(c))
		s=(s<<3)+(s<<1)+(c^48),c=getchar();
	return;
}
int f[MaxN][4];
int a[MaxN];
inline int dfs(int dep,int status,bool limit)
{
	if(!dep)
		return status==2;
	if(!limit&&~f[dep][status])
		return f[dep][status];
	reg int maxi=limit?a[dep]:9,res=0;
	for(int i=0;i<=maxi;++i)
	{
		int nstatus=status;
		if(!status&&i==4)
			nstatus=1;
		else if(status==1)
		{
			if(i==9)
				nstatus=2;
			else if(i!=4&&i!=9)
				nstatus=0;
		}
		res+=dfs(dep-1,nstatus,limit&&i==maxi);
	}
	if(!limit)
		f[dep][status]=res;
	return res;
}
inline int solve(int x)
{
	memset(f,-1,sizeof f);
	reg int n=0;
	while(x)
		a[++n]=x%10,x/=10;
	return dfs(n,0,true);
}
signed main(void)
{
	ios::sync_with_stdio(false);cin.tie(0);
	reg int t,x;cin>>t;
	for(int i=1;i<=t;++i)
	{
		cin>>x;
		cout<<solve(x)<<endl;
	}
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/chinesepikaync/p/12713501.html
今日推荐