您的位置:首页 > 其它

A very hard mathematic problem(天津online)

2012-12-07 10:19 295 查看
/* x^z+y^z+x*y*z=k,x<y , z>1 , max(k)=2^31,k已知!求x y z的组合,k的范围很明:1<k<32 ,显然当z取2的时候,是个完全平方式!那么如果考虑 (x+y)^z=k,那么(x+y)最大可以取到 1309左右,那么在1<k<32,0<x+y<1305,x<y;这个区间里面穷举就可以了!点击打开链接

#include < iostream >
#include <  cstdio  >
#include <  math.h  >
#define        N 1309
typedef    __int64 LL;
using  namespace std;
LL POW(int x,int y)
{
LL s=1;
for(int i=1;i<=y;i++) s*=x;
return s;
}
int  main ()
{
//freopen("t.txt","r",stdin);
LL x,y,z,k,s,t,r,w;
while(scanf("%I64d",&k),k)
{
s = 0; z = 2;
t = r = w =0;
t = ( LL )sqrt(k*1.0);
if(t * t == k) s= (t-1)/2;
while(z++<32)
{
for(t=0, x=1 ; x<N ; x++)
{
t = POW(x,z);
if(t >= k/2) break;
for(y=x+1 ; y<N ; y++)
{
r=POW(y,z);
w=t + r + x*y*z;
if(w>=k){
if(w==k) s+=1;
break;
}
}
}
}
printf("%I64d\n",s);
}
return 0;
}

PS:c++内部的pow()函数很不靠谱,运行效率低就算了,还对参数传递十分严格,以后不管什么情况,一定要自己写pow函数!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: