题目描述
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 44 个正整数的平方和。
如果把 00 包括进去,就正好可以表示为 44 个数的平方和。
比如:
5=02+02+12+225=02+02+12+22。
7=12+12+12+227=12+12+12+22。
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对 44个数排序使得 0≤a≤b≤c≤d。
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。
输入格式
程序输入为一个正整数 N(N<5e6)。
输出格式
要求输出 4 个非负整数,按从小到大排序,中间用空格分开。
输入输出样例
输入 #1
5输出 #1
0 0 1 2输入 #2复制
12输出 #2
0 2 2 2输入 #3
773535输出 #3
1 1 267 838
看到式子不要像我一样太着急着去找规律,这是蓝桥杯的考试题目类型之一。我以上来就想找到数字的规律以化简算法。这道题目只能暴力算法,因为拉格朗日也没有说明这四个数的范围和关系。但是需要注意的是,如果直接穷举需要四个for循环,但是你变化一下式子就可以减少它的“自由度”。
但是我的研究还是起到了一定作用,我发现对于n < 4 有( n / 2 ) * ( n / 2 ) > n ,所以可以减少一部分工作,还有就是n > a * a的时候( n / a ) * ( n / a ) > n 。
事实是我的思考不是白费的,如果不加以限制那么我的java(没有C++那么快)是通过不了的