A very hard mathematic problem(天津online)

/*  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函數!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章