1221. 四平方和 -蓝桥杯真题-哈希函数思想
原题链接:1221. 四平方和 - AcWing题库
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 44 个正整数的平方和。
如果把 00 包括进去,就正好可以表示为 44 个数的平方和。
比如:
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对 44 个数排序:
0≤a≤b≤c≤d
并对所有的可能表示法按 a,b,c,d为联合主键升序排列,最后输出第一个表示法。
输入格式
输入一个正整数 N。
输出格式
输出4个非负整数,按从小到大排序,中间用空格分开。
数据范围
0<N<5∗106
输入样例:
5
输出样例:
0 0 1 2
#include <iostream>
#include <cstring> // 提供memset函数的头文件
#include <algorithm> // 虽然在这个程序中没有直接使用algorithm库中的函数,但有时它提供有用的泛型算法
using namespace std;
const int N = 5000010; // 定义一个常数N作为数组大小,这里N设置为5,000,010
int n; // 存储用户输入的目标数值
int C[N], D[N]; // 定义两个数组C和D,用于存储特定计算结果
int main()
{
scanf("%d", &n); // 从标准输入读取一个整数,存储在变量n中
memset(C, -1, sizeof C); // 使用-1初始化数组C,sizeof C返回C占用的字节数,确保所有元素都被初始化为-1
// 遍历所有可能的c和d值,使得c^2 + d^2 <= n,并将这些值的结果存储在C和D数组中
for (int c = 0; c * c <= n; c ++ )
for (int d = c ; d * d + c * c <= n; d ++ )
{
int s = c * c + d * d; // 计算c^2 + d^2
if (C[s] == -1) // 如果C[s]还未被赋值(即第一次找到该s值)
C[s] = c, D[s] = d; // 将c和d分别存储到C[s]和D[s]中
}
// 查找是否存在a, b, c, d满足a^2 + b^2 + c^2 + d^2 = n
for (int a = 0; a * a <= n; a ++ )
for (int b = a; a * a + b * b <= n; b ++ ) // 注意b从a开始,避免重复组合
{
int s = n - a * a - b * b; // 计算剩余需要由c^2 + d^2填充的部分
if (C[s] != -1) // 如果存在这样的c和d使得c^2 + d^2 = s
{
printf("%d %d %d %d\n", a, b, C[s], D[s]); // 输出找到的一组解
return 0; // 找到一组解后立即退出程序
}
}
return 0; // 如果没有找到任何解,则程序正常结束
}