四平方和
题目描述
四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多四个正整数的平方和。如果把 0 包括进去,就正好可以表示为四个数的平方和。即对于一个给定的正整数 n,可以表示为:n = a2 + b2 + c2 + d2。
你需要求出 字典序 最小的一组解 a,b,c,d。字典序大小:从左到右依次比较,如果相同则比较下一项,直到有一项不同,较小的一方字典序更小,反之字典序更大,所有项均相同则二者字典序相同。
输入描述
输入为一个正整数 N。
输出描述
输出四个非负整数 a,b,c,d,中间用空格分开。
用例输入 1
5
用例输出 1
0 0 1 2
用例输入 2
12
用例输出 2
0 2 2 2
数据规模与约定
1 ≤ N ≤ 5000000 1≤N≤5000000 1≤N≤5000000。
思路
枚举前三个数 a , b , c a,b,c a,b,c,然后通过 d 2 = n − a 2 − b 2 − c 2 d^2=n-a^2-b^2-c^2 d2=n−a2−b2−c2 计算出 d 2 d^2 d2 的值,最后通过对其开方确定 d d d 是否为整数。若为整数,则说明此时 a , b , c , d a,b,c,d a,b,c,d 是一组解。
题目链接
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
int temp;
// 字典序从小到大枚举a,b,c.
for (int i = 0; i * i < n; i++)
for (int j = i; j * j < n; j++)
for (int k = j; k * k < n; k++)
{
// 优化:d不必再枚举,可以通过计算得到d的值,如果计算得到的temp开方后是整数,就说明d存在,否则不存在。
temp = n - i * i - j * j - k * k;
if ((int)pow((int)pow(temp, 0.5), 2) == temp) // 判断temp开方后是否为整数
{
cout << i << ' ' << j << ' ' << k << ' ' << (int)(pow(temp, 0.5)) << "\n"; // 如果是,则返回答案,并终止程序
return 0;
}
}
return 0;
}