solution.md 2.3 KB
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1 2 3 4 5
# 四平方和

四平方和定理,又称为拉格朗日定理:

每个正整数都可以表示为至多4个正整数的平方和。  
每日一练社区's avatar
每日一练社区 已提交
6

每日一练社区's avatar
每日一练社区 已提交
7 8 9
如果把0包括进去,就正好可以表示为4个数的平方和。  

比如:
每日一练社区's avatar
每日一练社区 已提交
10

每日一练社区's avatar
每日一练社区 已提交
11 12 13 14 15
```
5 = 0^ 2 + 0^ 2 + 1^ 2 + 2^2
7 = 1^ 2 + 1^ 2 + 1^ 2 + 2^2
(^符号表示乘方的意思)
```
每日一练社区's avatar
每日一练社区 已提交
16

每日一练社区's avatar
每日一练社区 已提交
17
对于一个给定的正整数,可能存在多种平方和的表示法。  
每日一练社区's avatar
每日一练社区 已提交
18

每日一练社区's avatar
每日一练社区 已提交
19
要求你对4个数排序:  
每日一练社区's avatar
每日一练社区 已提交
20

每日一练社区's avatar
每日一练社区 已提交
21 22 23
```
0 <= a <= b <= c <= d
```
每日一练社区's avatar
每日一练社区 已提交
24

每日一练社区's avatar
每日一练社区 已提交
25 26 27
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法  

程序输入为一个正整数N (N<5000000)  
每日一练社区's avatar
每日一练社区 已提交
28

每日一练社区's avatar
每日一练社区 已提交
29 30 31
要求输出4个非负整数,按从小到大排序,中间用空格分开  

例如,输入:
每日一练社区's avatar
每日一练社区 已提交
32

每日一练社区's avatar
每日一练社区 已提交
33 34 35
```
5
```
每日一练社区's avatar
每日一练社区 已提交
36

每日一练社区's avatar
每日一练社区 已提交
37
则程序应该输出:
每日一练社区's avatar
每日一练社区 已提交
38

每日一练社区's avatar
每日一练社区 已提交
39 40 41
```
0 0 1 2
```
每日一练社区's avatar
每日一练社区 已提交
42

每日一练社区's avatar
每日一练社区 已提交
43
再例如,输入:
每日一练社区's avatar
每日一练社区 已提交
44

每日一练社区's avatar
每日一练社区 已提交
45 46 47
```
12
```
每日一练社区's avatar
每日一练社区 已提交
48

每日一练社区's avatar
每日一练社区 已提交
49
则程序应该输出:
每日一练社区's avatar
每日一练社区 已提交
50

每日一练社区's avatar
每日一练社区 已提交
51 52 53
```
0 2 2 2
```
每日一练社区's avatar
每日一练社区 已提交
54

每日一练社区's avatar
每日一练社区 已提交
55
再例如,输入:
每日一练社区's avatar
每日一练社区 已提交
56

每日一练社区's avatar
每日一练社区 已提交
57 58 59
```
773535
```
每日一练社区's avatar
每日一练社区 已提交
60

每日一练社区's avatar
每日一练社区 已提交
61
则程序应该输出:
每日一练社区's avatar
每日一练社区 已提交
62

每日一练社区's avatar
每日一练社区 已提交
63 64 65 66 67 68
```
1 1 267 838
```

以下程序实现了这一功能,请你补全空白处内容:

每日一练社区's avatar
每日一练社区 已提交
69
```c
每日一练社区's avatar
每日一练社区 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int MAXN = 2500010;
struct Node
{
    int s, c, d;
    bool operator<(const Node &t) const
    {
        if (s != t.s)
            return s < t.s;
        if (c != t.c)
            return c < t.c;
        return d < t.d;
    }
} sum[MAXN];
int n, m;
int main()
{
    cin >> n;
    for (int c = 0; c * c <= n; c++)
        for (int d = c; c * c + d * d <= n; d++)
            sum[m++] = {c * c + d * d, c, d};
    sort(sum, sum + m);
    for (int a = 0; a * a <= n; a++)
    {
        for (int b = 0; a * a + b * b <= n; b++)
        {
            int t = n - a * a - b * b;
            int l = 0, r = m - 1;
            while (l < r)
            {
                __________________
                if (sum[mid].s >= t)
                    r = mid;
                else
                    l = mid + 1;
            }

            if (sum[l].s == t)
            {
                printf("%d %d %d %d", a, b, sum[l].c, sum[l].d);
                return 0;
            }
        }
    }
    return 0;
}
```

## aop

### before

每日一练社区's avatar
每日一练社区 已提交
125
```c
每日一练社区's avatar
每日一练社区 已提交
126 127 128 129 130

```

### after

每日一练社区's avatar
每日一练社区 已提交
131
```c
每日一练社区's avatar
每日一练社区 已提交
132 133 134 135 136

```

## 答案

每日一练社区's avatar
每日一练社区 已提交
137
```c
每日一练社区's avatar
每日一练社区 已提交
138 139 140 141 142 143 144
int mid = l + r >> 1;
```

## 选项

### A

每日一练社区's avatar
每日一练社区 已提交
145
```c
每日一练社区's avatar
每日一练社区 已提交
146 147 148 149 150
int mid = l + (r >> 1);
```

### B

每日一练社区's avatar
每日一练社区 已提交
151
```c
每日一练社区's avatar
每日一练社区 已提交
152 153 154 155 156
int mid = l + r;
```

### C

每日一练社区's avatar
每日一练社区 已提交
157
```c
每日一练社区's avatar
每日一练社区 已提交
158 159
int mid = l + r + 1;
```