蓝桥杯 第七届蓝桥杯省赛C++A/B组 四平方和
四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 4 个正整数的平方和。 如果把 0 包括进去,就正好可以表示为 4 个数的平方和。 比如: 5=0^2+0^2+1^2+2^2 7=1^2+1^2+1^2+2^2 对于一个给定的正整数,可能存在多种平方和的表示法。 要求你对 44 个数排序: 0≤a≤b≤c≤d 并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。 输入格式 输入一个正整数 N。 输出格式 输出4个非负整数,按从小到大排序,中间用空格分开。 数据范围 0<N<5∗10^6 输入样例: 5 输出样例: 0 0 1 2 0<N<5∗10^6,因此a,b,c,d的最大取值约为5000,而暴力三层循环时间复杂度会达到10^9,虽然这道题的三次循环也可以过,,, 更好的算法思路是: 用空间换时间,将3层循环换成两次的两层循环这样在时间复杂度上就是可以接受的了。 先一个二层循环将c^2 + d^2 存起来。 然后再来一个二层循环 看 n - a^2 - b^2 在之前算出来的c^2 + d^2 中查找看出现过没,如果出现过, 说明a^2 + b^2 + c^2 + d^2 == n 是成立的。 至于上面用的查找,为了加快速度可以用二分来进行查找 // 用map存储的 #include<iostream> #include