题目大意:
给你一个直角三角形的一条直角边的平方n,这条边可能是直角边,然后要求求出另外一条直角边,还有求出斜边的长度,要求另外一条直角边跟斜边都是整数。 1 <= n <= 10^9.
解题思路:
给出的直角边异常巨大,而且另外两条边的长度根本没有上限。但是可以转换。z^2 - y^2 = n,那么有(z + y)*(z - y) = n,变成了
a * b = n,由于z跟y都是整数,那么a跟b都是整数,并且a跟b都肯定大于0,是自然数,因为z必定大于y。所以枚举出所有a跟b,然后
z + y = a, z - y = b,由这两个公式求出z跟y即可。
解题感想:
比赛的时候稍微想到了转换,但是闲麻烦就没有继续转换下去了,想想自己实在是太笨了。
代码:
#include <iostream>
#include <cmath>
using namespace std;
int main(void)
{
int cas;
scanf("%d", &cas);
while(cas--)
{
int n, a, b, z, y;
scanf("%d", &n);
int tempn = (int)sqrt((double)n);
int ansY, ansZ;
ansY = ansZ = INT_MAX;
for(int i = 1; i <= tempn; i++)
{
if(n % i == 0)
{
a = n / i;
b = i;
if((a + b) % 2 == 0)
{
z = (a + b) / 2;
y = z - min(a, b);
if(z < ansZ || y < ansY)
{
ansY = y, ansZ = z;
}
}
}
}
if(ansZ == INT_MAX)//有一个能求,另一个就可求
{
printf("IMPOSSIBLE\n");
}
else
printf("%d %d\n", ansY, ansZ);
}
return 0;
}