hdu -4282

//二分x或y,其他的直接暴力枚举就可以了

 

 

#include<stdio.h>
#include<string.h>
#include<math.h>
__int64 p[51000][32];
int main()
{
	int sum;
	__int64 x,y,z,k,s,e,mid;
	__int64 xx,kk,k1,k2;
	memset(p,0,sizeof(p));
	kk=1;
	kk<<=32;
	for(x=1;x<=50000;x++)
	{
		p[x][0]=1;
		for(y=1;y<32;y++)
		{
			if(p[x][y-1]<0)
			{
				p[x][y]=-1;
				continue;
			}
			p[x][y]=p[x][y-1]*x;
			if(p[x][y]>kk)
				p[x][y]=-1;
		}
	}
	while(scanf("%I64d",&k),k)
	{
		sum=0;
		k1=(__int64)sqrt((double)k);
		for(z=2;z<=31;z++)
		{
			for(x=1;x<=k1;x++)
			{
				if(p[x][z]==-1||p[x][z]>k)
					break;
				xx=p[x][z];
				k2=k-xx;
				kk=x*z;
				s=x+1,e=k1+1;
				while(s<=e)
				{
					mid=(s+e)>>1;
					if(p[mid][z]==-1||p[mid][z]>k2||mid*kk>k2||p[mid][z]+mid*kk>k2)
						e=mid-1;
					else if(p[mid][z]+mid*kk==k2)
					{
						sum++;
						break;
					}
					else s=mid+1;
				}
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值