毕达哥拉斯三元组————题目链接
根据题目给出的数据范围我们能够知道,如果利用双重循环解题,时间复杂度为O(n^2),无法通过最后几个较大的数据点。因此如果希望本题拿满分,需要将时间复杂度限制在O(n)。
我们在解题时,利用循环来枚举所有可能的数字a,此时,我们已知的变量有n和a,接下来的目标是将b和c均用n和a进行表示。数字b和c我们可以通过解方程组的形式得到,已知:
由得:b + c = n - a
由得:b ^ 2 - c ^ 2 = - a ^ 2,根据平方差公式,可得:(b + c)*(b - c)= - a ^ 2
将代入中
中,得:(n - a)* (b - c) = -a ^ 2,进一步可得:
,得:
,得:
(当然其实我们的c直接用c = n - a - b更方便)
最后进行判断,如果满足毕达哥拉斯三元组的条件,就进行输出,代码如下:
#include <iostream>
using namespace std;
int main()
{
long long n;
cin >> n;
//优化,尽量使用一重循环
for (long long a = 1; a <= n / 3; a++) {
long long b = (n - a - a * a / (n - a )) / 2;
long long c = n - a - b;
if (a * a + b * b == c * c && a < b && b < c)
cout << a << " " << b << " " << c << endl;
}
return 0;
}