题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4282
题目描述:
去你妹啊。。真是一个非常难的数学问题
已知 K。(0 < K < 2^31)
求方程 X^Z + Y^Z + XYZ = K (X < Y, Z > 1) 有几组解。
解题思路:
九野说这个是二分,以我的能力真的挺不好写的,后来想想,2^16才几万,Z又肯定是31以内,似乎暴力就行,但是写出来的一直TLE,不知为何!蛋疼数小时后看了别人代码。原来Z越小,循环里算的次数越多,Z为2的时候,两层内循环就会超时,Z为3则好了很多,一层大概只有几百,两侧也不超时。显然Z=2时,是完全平方式,特殊处理一下就AC了。
这道题告诉我们别瞧不起暴力,暴力也是一种方法,而且暴力不是傻傻的遍历,经过改良就可以AC很多问题!
AC代码:
#include <iostream>
#include <cmath>
#include <cstdio>
#include <ctime>
typedef long long LL;
using namespace std;
LL k,x,y,z,ans;
LL cimi(LL x,LL y)
{
LL i,ans=1;
for(i=1;i<=y;i++)
ans*=x;
return ans;
}
int main()
{
while(cin>>k,k)
{
ans=0;
int sq=(int)sqrt(k);
if(sq*sq==k)
ans+=(sq-1)/2;
for(z=3;z<31;z++)
{
for(x=1;x<sq;x++)
{
LL u=cimi(x,z);
if(u>k/2)
break;
for(y=x+1;;y++)
{
LL v=cimi(y,z);
if(u+v+x*y*z==k)
{
ans++;break;
}
if(u+v+x*y*z>k)
break;
}
}
}
cout<<ans<<endl;
}
return 0;
}
AC截图: