题意: X^Z + Y^Z + XYZ = K, (X < Y, Z > 1)。告诉你最后K(0 < K < 2^31)的值,问符合这个等式的X,Y,Z的组合有多少种
分析:二分法
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;
LL mat[50001][32]= {0};
bool binarySearch(int x,int z,int cnt)//二分法解题
{
int l=x+1,r=50000,mid;
for(; l<=r;)
{
mid=(l+r)>>1;
if(mat[mid][z]==0)
{
r=mid-1;
continue;
}
if(mat[mid][z]+x*mid*z<cnt)
l=mid+1;
else if(mat[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)
{
mat[i][1]=i;
for(int j=2; j<=31; ++j)
{
mat[i][j]=mat[i][j-1]*i;
if(mat[i][j]>2147483648LL) break;//一定要加上LL
}
}
for(; cin>>k,k;)//有另一功能,k为0结束
{
long long summ=0;
int cnt;
for(int x=1; x<=50000&&x<=k; ++x)
for(int z=2; z<=31; ++z)
{
if(mat[x][z]==0) break;
cnt=k-mat[x][z];
if(cnt-x*z<=0) break;
if(binarySearch(x,z,cnt))
summ++;
}
cout<<summ<<endl;
}
return 0;
}