题意:X^Z + Y^Z + XYZ = K,已知K(0 < K < 2^31)的值,求符合这个等式的X,Y,Z的组合个数
解析:因为中间有幂次 所以对幂次打个表 然后二分搜Y
#include<iostream>
using namespace std;
__int64 map[50001][32]={0};
bool binary(int x,int z,int cnt)
{
int l=x+1,r=50000,mid;
while(l<=r)
{
mid=(l+r)>>1;
if(map[mid][z]==0)
{
r=mid-1;
continue;
}
if(map[mid][z]+x*mid*z<cnt)
l=mid+1;
else if(map[mid][z]+x*mid*z>cnt)
r=mid-1;
else
return true;
}
return false;
}
int main()
{
int k;
for(int i=1;i<=50000;++i)
{
map[i][1]=i;
for(int j=2;j<=31;++j)
{
map[i][j]=map[i][j-1]*i;
if(map[i][j]>0x7fffffff) break;
}
}
while(scanf("%d",&k)!=EOF)
{
if(k==0)return 0;
long long summ=0;
int cnt;
for(int x=1;x<=50000&&x<=k;++x)
for(int z=2;z<=31;++z)
{
if(map[x][z]==0) break;
cnt=k-map[x][z];
if(cnt-x*z<=0) break;
if(binary(x,z,cnt))
summ++;
}
printf("%I64d\n",summ);
}
return 0;
}