hdu3419

/*
分析:
    脑袋跟抽了似的,一道水水的深搜写了半天,
还好一次ac了,囧。。。

                                        2012-09-24
*/










#include"stdio.h"
#include"string.h"
int a,b,c;
int ans;
int hash[10];
int base[11],limit;
int t_a;
int t_b;
void judge()
{
	int i;
	int t;
	int temp[10];
	t=t_a*t_b;
	if(limit<=t || t<base[c])	return ;
	memset(temp,0,sizeof(temp));
	while(t)
	{
		if(hash[t%10])	return ;
		temp[t%10]=1;
		t/=10;
	}
	t=0;
	for(i=1;i<10;i++)	if(temp[i])	t++;
	if(t!=c)	return ;
	ans++;
}
void DFS2(int k)
{
	int i;
	if(k>=base[b+1])	return ;
	if(base[b]<=k)		{t_b=k;judge();return ;}
	for(i=1;i<10;i++)
	{
		if(hash[i]==0)
		{
			hash[i]=1;
			DFS2(k*10+i);
			hash[i]=0;
		}
	}
}
void DFS(int k)
{
	int i;
	if(k>=base[a+1])	return; 
	if(base[a]<=k)
	{
		t_a=k;
		DFS2(0);
		return ;
	}
	for(i=1;i<10;i++)
	{
		if(hash[i]==0)
		{
			hash[i]=1;
			DFS(k*10+i);
			hash[i]=0;
		}
	}
}
int main()
{
	int i;
	while(scanf("%d%d%d",&a,&b,&c),a||b||c)
	{
		if(a==0 || b==0 || c==0)	{printf("0\n");continue;}
		if(a+b-2>c)					{printf("0\n");continue;}

		base[1]=1;
		for(i=2;i<=10;i++)	base[i]=base[i-1]*10;
		limit=base[c+1];

		ans=0;
		memset(hash,0,sizeof(hash));
		DFS(0);
		printf("%d\n",ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值