[蓝桥杯] 四平方和

[蓝桥杯] 四平方和

峰值内存消耗 < 256M  CPU消耗  < 3000ms

【题目描述 - Problem Description】

四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和。 如果把0包括进去,就正好可以表示为4个数的平方和。

 

比如:

5 = 0^2 + 0^2 + 1^2 + 2^2

7 = 1^2 + 1^2 + 1^2 + 2^2

(^符号表示乘方的意思)

 

对于一个给定的正整数,可能存在多种平方和的表示法。

要求你对4个数排序:

0 <= a <= b <= c <= d

并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法

程序输入为一个正整数N (N<5000000)

要求输出4个非负整数,按从小到大排序,中间用空格分开

 

输入 5 12 773535
输出 0 0 1 2 0 2 2 2 1 1 267 838

 

 

 

【题解】

  搜索,注意剪枝。

  四层循环的速度可以……因为强迫症自己又写了个DFS版本……

 

【代码 C++】

 1 #include <cstdio>
 2 int main() {
 3     int i1, i2, i3, i4, s1, s2, s3, s4, n;
 4     scanf("%d", &n);
 5     for (i1 = 0;; ++i1){
 6         s1 = i1*i1;
 7         for (i2 = i1; s1 + i2*i2 * 3 <= n; ++i2){
 8             s2 = s1 + i2*i2;
 9             for (i3 = i2; s2 + i3*i3 * 2 <= n; ++i3){
10                 s3 = s2 + i3*i3;
11                 for (i4 = i3; s3 + i4*i4 <= n; ++i4){
12                     s4 = s3 + i4*i4;
13                     if (s4 == n){
14                         printf("%d %d %d %d\n", i1, i2, i3, i4);
15                         goto ed;
16                     }
17                 }
18             }
19         }
20     }
21 ed:;
22     return 0;
23 }
for
 1 #include <cstdio>
 2 int n, q[5];
 3 bool isFid;
 4 void DFS(int lst, int i, int sum){
 5     if (isFid) return;
 6     if (i){
 7         int tmp;
 8         while (sum + lst*lst*i <= n){
 9             q[i] = lst;
10             DFS(lst, i - 1, sum + lst*lst);
11             ++lst;
12         }
13     }
14     else if (sum == n){
15         printf("%d %d %d %d\n", q[4], q[3], q[2], q[1]);
16         ++isFid;
17     }
18 }
19 int main() {
20     scanf("%d", &n);
21     DFS(0, 4, 0);
22     return 0;
23 }
DFS

 

posted @ 2017-03-07 19:40  Simon_X  阅读(572)  评论(0编辑  收藏  举报