疯狂WA.
仍然不知道为什么我是错的.

User

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
相同的差

已知正整数x,y,z构成等差数列,使得方程x^2 − y^2 − z^2 = n有两个解的最小正整数为n=27:

34^2 − 27^2 − 20^2 = 12^2 − 9^2 − 6^2 = 27
使得方程有十个解的最小正整数为n = 1155。

在小于一百万的数中,有多少个n的取值使得方程恰好有十个不同的解?

我想直接枚举,但是WA了...

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

const int LIM = 1000000;
int tb[LIM+5];

int main() {
for (i64 k = 1; k <= LIM; k++) {
for (i64 x = 1; x <= 2*k; x++) {
i64 n = 1* x * (4* k - x);
if(n>=LIM)break;
tb[n]+=2;
if(x==2*k)tb[n]--;
}
// if(k%10000==0){
// cout<<"! "<<k<<"\n";
// cout.flush();
// }
}

long long ans = 0;
for (int i = 1; i < LIM; i++) {
if (tb[i] == 10) ans++;
}
cout << ans;
}


怎么回事??

DeepSeek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
我们来重新梳理一下这个问题。

---

## **1. 题意转换**

已知 \(x, y, z\) 为正整数且成等差数列。

设差为 \(d > 0\),那么有:

\[
y = x - d,\quad z = x - 2d
\]

题目条件是:

\[
x^2 - y^2 - z^2 = n
\]

代入:

\[
x^2 - (x-d)^2 - (x-2d)^2 = n
\]

展开:

\[
x^2 - [x^2 - 2xd + d^2] - [x^2 - 4xd + 4d^2] = n
\]

\[
x^2 - x^2 + 2xd - d^2 - x^2 + 4xd - 4d^2 = n
\]

\[
(-x^2) + (6xd) - 5d^2 = n
\]

整理:

\[
n = -x^2 + 6xd - 5d^2
\]

这是关于 \(x\) 的二次式,也可用关于 \(d\) 的二次式更方便。

---

我们交换视角:设中间项为 \(y\),公差为 \(d\),则:

\[
x = y+d, \quad z = y-d
\]
且 \(y > d > 0\)。

代入:

\[
x^2 - y^2 - z^2
= (y+d)^2 - y^2 - (y-d)^2
\]

展开:

\[
= y^2 + 2yd + d^2 - y^2 - (y^2 - 2yd + d^2)
\]

\[
= 2yd + d^2 - y^2 + 2yd - d^2
\]

合并同类项:

\[
(2yd + 2yd) + (d^2 - d^2) - y^2
\]

\[
= 4yd - y^2
\]

即:

\[
n = y^2 - 4yd?
\]
等一下,检查:

第一项:\((y+d)^2 - y^2 - (y-d)^2\)
= \(y^2 + 2yd + d^2 - y^2 - (y^2 - 2yd + d^2)\)
= \(2yd + d^2 - y^2 + 2yd - d^2\)
= \(4yd - y^2\) (这里 \(d^2 - d^2=0\))

所以 \(n = 4yd - y^2\)。
写作 \(n = y(4d - y)\)。

---

## **2. 正整数解条件**

已知 \(y > d > 0\),且 \(x = y+d > 0\),\(z = y-d > 0 \implies y > d\)。

此外 \(x, y, z\) 为正整数,所以 \(y \ge d+1\)。

我们设 \(t = y-d > 0\),则 \(y = d + t\),于是:

\[
n = y(4d - y) = (d+t)(4d - (d+t)) = (d+t)(3d - t)
\]
且 \(t > 0\),\(d > 0\),并且 \(z = y-d = t > 0\) 自然成立。
另外 \(x = y+d = d+t+d = 2d+t > 0\) 自动成立。

所以本质上我们只需要 \(d > 0\),\(t > 0\),且 \(t < 3d\)(因为 \(3d - t > 0\) 才能 \(n>0\))。

于是每个正整数 \(n\) 可以表示为 \(n = (d+t)(3d - t)\),其中 \(d, t\) 为正整数,且 \(t < 3d\)。

---

## **3. 变量代换减少自由度**

设 \(u = d+t\),\(v = 3d - t\),则:

\[
u + v = 4d \implies d = \frac{u+v}{4}
\]
\[
u - v = (d+t) - (3d - t) = -2d + 2t \implies t = \frac{u-v+2d}{2} = \frac{u-v + \frac{u+v}{2}}{?}
\]
可以简化:直接由 \(u = d+t\),\(v=3d-t\) 得
\(u+v = 4d\) 得 \(d = (u+v)/4\),
\(u - v = -2d + 2t \implies 2t = u-v+2d = u-v + (u+v)/2 = (2u-2v + u+v)/2\)? 有点乱。

我们回到原始条件:
\(u = d+t\),\(v = 3d-t\),且 \(t>0\),\(d>0\),\(t<3d\)。

由 \(t<3d \iff t = u-d < 3d \iff u < 4d \iff u < u+v \iff v > 0\),自动成立因为 \(v>0\)。

还有 \(t>0 \iff u>d \iff u > (u+v)/4 \iff 4u > u+v \iff 3u > v\)。

还有 \(d>0 \iff u+v>0\),自动成立。

所以约束条件是:\(u, v\) 为正整数,\(3u > v\),并且 \(u+v\) 是 4 的倍数(因为 \(d = (u+v)/4\) 为整数),并且 \(u-v\) 必须是偶数(因为 \(t = (u-v)/2 + d\) 需要为整数?)我们来检查整数性:

由 \(d = (u+v)/4\) 为整数要求 \(u+v \equiv 0 \pmod{4}\)。

然后 \(t = u - d = u - (u+v)/4 = (4u - u - v)/4 = (3u - v)/4\) 必须为正整数。所以 \((3u-v)\) 必须为正且被 4 整除。

所以我们得到简洁条件:

- \(u, v\) 正整数
- \(u+v \equiv 0 \pmod{4}\)
- \(3u > v\)
- \(3u - v \equiv 0 \pmod{4}\)

这时 \(n = uv\)。

每个 \((u,v)\) 对应一组 \((d,t)\),从而对应一组等差数列 \((x,y,z)\):

\(d = (u+v)/4\),
\(t = (3u-v)/4\),
\(y = d+t = u\),
\(x = y+d = u + (u+v)/4 = \frac{4u+u+v}{4} = \frac{5u+v}{4}\),
\(z = y-d = u - (u+v)/4 = \frac{4u - u - v}{4} = \frac{3u - v}{4}\)。

所以这三个数都是正整数(由上面模条件)。

---

## **4. 枚举计数方法**

问题:对于固定的 \(n\),找到 \((u,v)\) 正整数使得:
1. \(uv = n\)
2. \(u+v \equiv 0 \pmod{4}\)
3. \(3u > v\)
4. \(3u - v \equiv 0 \pmod{4}\)

条件 4 可以由条件 2 推导出来吗?检验:若 \(u+v\) 是 4 的倍数,那么 \(3u-v = 4u - (u+v)\),由于 \(4u\) 是 4 的倍数,\(u+v\) 是 4 的倍数,所以差 \(3u-v\) 也是 4 的倍数。所以条件 4 自动成立。

另外由 \(3u>v\) 与 \(v=n/u\),得 \(3u > n/u \implies 3u^2 > n\)。

所以对于每个 \(u\) 整除 \(n\),令 \(v = n/u\),我们要求:
- \(u+v \equiv 0 \pmod{4}\)
- \(3u > v\)(且 \(u \le v\) 可能会有对称重复?)

注意:\((u,v)\) 与 \((v,u)\) 在 \(n\) 相同的情况下不同,但会给出相同的等差数列吗?我们要检验。

若交换 \(u, v\),那么新的 \(u' = v, v' = u\),条件 \(3u'>v'\) 变成 \(3v > u\),不一定与原条件等价,所以 \((u,v)\) 与 \((v,u)\) 是两个不同的解(当两者都满足各自条件时),但会不会对应同一组 \((x,y,z)\)?

计算一下:
对 \((u,v)\) 得到:
\(x_1 = (5u+v)/4\),
\(y_1 = u\),
\(z_1 = (3u-v)/4\)。

对 \((v,u)\) 得到:
\(x_2 = (5v+u)/4\),
\(y_2 = v\),
\(z_2 = (3v-u)/4\)。

一般来说不相同(除非 \(u=v\))。但等差数列由 \(x,y,z\) 顺序固定,而这里 \((x_1,y_1,z_1)\) 与 \((x_2,y_2,z_2)\) 不一定是同一组三个数(排序后),所以是不同的解。

因此我们要数 **有序** \((u,v)\) 正整数对,\(uv=n\),满足:
- \(u+v \equiv 0 \pmod{4}\)
- \(3u > v\)

这等价于 \(u^2 < n < 3u^2\) 且 \(u+v \equiv 0 \pmod{4}\)。

---

## **5. 等价约束**

\(u+v \equiv 0 \pmod{4} \iff u + n/u \equiv 0 \pmod{4}\)。

设 \(u \equiv a \pmod{4}\),\(n/u \equiv b \pmod{4}\),则 \(a+b \equiv 0 \pmod{4}\),且 \(ab \equiv n \pmod{4}\)。

所以 \(a\) 与 \(n/a \pmod{4}\) 和为 0 模 4。
对于给定的 \(n\),枚举它的因子 \(u\),检查这两个条件。

另外 \(v = n/u\),条件 \(3u>v\) 即 \(3u > n/u \implies u^2 > n/3\) 且 \(u^2 < n\)?不对,应该是 \(u^2 < 3n\)?我们仔细看:

\(3u > v = n/u \implies 3u^2 > n \implies u^2 > n/3\)。

还有 \(u\) 是因子,所以 \(u \le n\),自动满足。

但还有一个隐含条件:\(t>0\) 等价于 \(3u>v\),已经包含了。同时 \(z = (3u-v)/4 >0\) 也即 \(3u>v\)。所以只要 \(3u>v\) 即可。

另外, \(x = (5u+v)/4 > y = u \iff 5u+v > 4u \iff u+v > 0\) 自动成立。
\(y = u > z = (3u-v)/4 \iff 4u > 3u - v \iff u > -v\) 自动成立(都是正数)。
且 \(z>0\) 已经由 \(3u>v\) 保证。

所以唯一条件是:
1. \(u \mid n\)
2. \(u + n/u \equiv 0 \pmod{4}\)
3. \(u^2 > n/3\)

注意:对称对 \((u,v)\) 和 \((v,u)\) 可能会被双重计数,当两者都满足 \(3u>v\) 和 \(3v>u\) 时。那意味着:
\(u^2 > n/3\) 且 \(v^2 = n^2/u^2 > n/3 \implies n^2/u^2 > n/3 \implies n/u^2 > 1/3 \implies u^2 < 3n\) 且 \(u^2 > n/3\) 且 \(v^2 > n/3\)(对另一个也成立),这等价于 \(n/3 < u^2 < 3n\)。

对于 \(u \neq v\),即 \(u^2 \neq n\),区间 \((n/3, 3n)\) 包含 \(n\),所以当 \(u^2\) 在 \((n/3, n)\) 时,\(v^2 = n^2/u^2\) 在 \((n, 3n)\),所以它们在不同区间,不会同时满足 \(3u>v\) 和 \(3v>u\)?检查:
若 \(u^2 < n\),则 \(v = n/u > u\),那么 \(3u > v\) 成立?不一定,因为 \(v\) 可以大于 \(3u\)。
实际上 \(3u>v\) 即 \(3u > n/u \iff u^2 > n/3\)。
而 \(3v>u\) 即 \(3n/u > u \iff u^2 < 3n\)。

所以两个同时成立就是 \(n/3 < u^2 < 3n\)。
\(u^2 = n\) 时,\(3u>u\) 成立(相等?不,当 \(u=v\) 时 \(3u = 3v\) 对 \(3u>v\) 就是 \(3u>u\) 成立),允许,但 \(u=v\) 只算一次。

所以我们只需对每个 \(u\) 因子检查 \(u^2 > n/3\),然后计数,这自动包含 \(u \le v\) 或 \(u \ge v\) 的处理,因为 \(u\) 遍历所有因子,所以每个解被计数一次(对应一个 \(u\),不是对 \((u,v)\) 对称两个)。

因为若 \(u < v\) 且 \(3u>v\),那么 \(u^2 > n/3\),若 \(u>v\) 且 \(3u>v\)(不可能,因为 \(u>v\) 则 \(3u>v\) 必然成立,但 \(u>v\) 意味着 \(u^2 > n\),\(u^2 > n/3\) 也成立),但这样 \((v,u)\) 会作为另一个因子对计数?我们要小心。

---

更好方法:对每个因子 \(u\) 满足 \(u^2 > n/3\) 且 \(u + n/u \equiv 0 \pmod{4}\),计数一次。这样就不会重复(因子对有序)。但是否会漏掉 \(u^2 \le n/3\) 的解?

若 \(u^2 \le n/3\),则 \(3u \le n/u\),不满足 \(3u>v\),故无解。所以就是要求 \(u^2 > n/3\)。

于是最终:
**对每个 \(n\),解的个数 = 满足下列条件的因子 \(u\) 的个数:**
- \(u \mid n\)
- \(u + n/u \equiv 0 \pmod{4}\)
- \(u^2 > n/3\)

---

## **6. 你的代码分析**

你的代码变量:
`k` 是什么?似乎是设 \(x = 2k\) 吗?仔细看:

你写:
1
2
3
4
5
6
7
8
for (i64 k = 1; k <= LIM; k++) {
for (i64 x = 1; x <= 2*k; x++) {
i64 n = 1* x * (4* k - x);
if(n>=LIM)break;
tb[n]+=2;
if(x==2*k)tb[n]--;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
这里 \(n = x(4k-x)\),这和 \(n = y(4d-y)\) 对比:  
我们之前 \(n = y(4d - y)\),令 \(y\) 为中间项,\(d\) 公差。

但这里 \(k\) 是什么?假设 \(k = d\)(公差),那么 \(n = y(4d-y)\)。你设 \(x = y\),则 \(n = x(4k-x)\),但 \(x\) 从 1 到 \(2k\)?

因为 \(x = y = d+t\),\(t>0\) 要求 \(y>d\),即 \(x>k\),且 \(t<3d \implies y<4d\) 即 \(x<4k\)。

\(y>d\) 即 \(x>k\),所以范围是 \(k < x < 4k\)。

而你的 \(x\) 从 1 到 \(2k\),这和 \(x>k\) 对上了 \(x=k+1,\dots,2k,\dots\) 但你的上限是 \(2k\),然而实际 \(x\) 可达 \(4k-1\)(因为 \(y<4d\) 且 \(y>d\) 正整数)。上限 \(2k\) 似乎太小,会漏解。

另外你 `if(x==2*k)tb[n]--`,可能是避免重复计数对称?但公式可能错了。

---

**主要问题:** 你只枚举了 \(x\) 到 \(2k\),但 \(x\) 最大可以接近 \(4k-1\)(当 \(t\) 略小于 \(3d\) 时)。所以漏了许多解。

这解释为什么 WA。

---

## **7. 正确枚举方法(直接法)**

我们枚举 \(d\) 和 \(t\),\(n = (d+t)(3d-t)\),且 \(t>0\),\(3d>t\)。

这样 \(n < 10^6\) 限制下,\(d\) 可以到多少?
当 \(d\) 固定,\(t\) 从 1 到 \(3d-1\),\(n = (d+t)(3d-t) = -t^2 + 2dt + 3d^2\),对于 \(t\) 是二次函数,最大值在 \(t=d\) 时,值为 \( (d+d)(3d-d) = 2d \cdot 2d = 4d^2\)。

所以 \(4d^2 \le 10^6 \implies d \le 500\)。

实际上 \(t\) 接近 1 或 \(3d-1\) 时 \(n\) 较小,但为覆盖所有 \(n<10^6\), \(d\) 的上界可能是更大的,但最大值 \(n\) 不超过 \(4d^2\),所以如果我们要 \(n<10^6\),那么 \(4d^2 < 10^6 \implies d < 500\)。但 \(t\) 变化可能使某些 \(d>500\) 也产生 \(n<10^6\)(比如 \(t\) 接近 \(3d\) 时 \(n\) 很小),所以不能只限制 \(d\) 到 500。

但 \(d>500\) 时,\(n = (d+t)(3d-t) \ge (d+1)(3d-1)\) 也很大?如果 \(t=1\),\(n = (d+1)(3d-1) \approx 3d^2\),需要 \(3d^2 < 10^6 \implies d < 577.35\)。所以最大 \(d\) 约 577。

但再检查:\(t\) 接近 \(3d\) 时,比如 \(t=3d-1\),\(n=(d+3d-1)(3d-3d+1)=(4d-1)(1) = 4d-1\),即使 \(d\) 很大,这个 \(n\) 也可能小于 \(10^6\)。所以 \(d\) 可以很大,比如 \(d=10^6\),\(t=3d-1\),\(n=4d-1=4\times 10^6-1>10^6\)?不,此时 \(d+t=4d-1 \approx 4\times 10^6\),乘 \(3d-t=1\),确实 \(n\) 很大?不对,我算错了:

\(t=3d-1\):
\(d+t = d+3d-1 = 4d-1\),
\(3d-t = 3d-(3d-1)=1\),
所以 \(n=4d-1\)。对的,当 \(d=250000\),\(n\approx 10^6\),所以 \(d\) 最大可达 250000?但我们要 \(n<10^6\),所以 \(d \le 250000\) 左右。

但这会导致枚举 \(d\) 从 1 到 250000,内层 \(t\) 从 1 到 \(3d-1\),总循环量太大(\(O(d^2)\) 大约 \(10^{11}\)),不行。

---

所以得用因子枚举法:
固定 \(n\),找它的因子分解,数出满足条件的 \(u\) 的个数,判断是否等于 10。

于是我们只需对每个 \(n<10^6\),计算它的因子并检查条件。

可以优化:枚举 \(u\) 从 1 到 \(10^6\),对每个 \(u\) 枚举 \(v\) 使得 \(uv \le 10^6\),同时 \(u+v\) 是 4 的倍数,且 \(3u>v\)(等价于 \(u^2 > uv/3 = n/3\)),用数组计数 `cnt[n]++`。

这样复杂度:对每个 \(u\),\(v\) 从 \(u\) 开始(否则重复),且满足 \(u+v \equiv 0 \pmod{4}\),所以 \(v\) 从 \( (4 - u\bmod 4) \bmod 4 \) 的某个起点,步长 4。
且 \(v \ge u\)(避免重复因子对 \((u,v)\) 与 \((v,u)\) 双重计数?但这里我们是把 \(u\) 看作 \(y\),\(y\) 可以小于 \(v\) 吗?实际上 \(u=y\),\(v=4d-y\),没有明显要求 \(u\le v\),只是我们枚举因子对时不限制 \(u\le v\),会重复吗?

看公式 \(n = uv\),同一个 \(n\) 会有 \(u\) 和 \(v\) 都当作 \(y\) 的情况?但 \(y\) 是中间项,没有顺序限制,所以每个因子 \(u\) 对应一个解,无论 \(u\) 与 \(v\) 大小。所以我们枚举所有因子 \(u\)(遍历所有 \(u\))即可,无需避免对称重复,但也不重复计算,因为一个 \(u\) 一个解。

于是我们可以:
1. 初始化 `cnt[n]=0` for all n。
2. 对于 \(u\) 从 1 到 \(10^6\),对于 \(v\) 使得 \(uv \le 10^6\) 且 \(u+v\) 是 4 的倍数 且 \(3u>v\):
- `cnt[uv]++`。

复杂度:对每个 \(u\),\(v\) 的步长为 4,且 \(v < 3u\) 且 \(uv \le 10^6\),所以 \(v \le \min(3u-1, 10^6/u)\)。
这个循环次数大致 \(\sum_{u=1}^{10^6} \frac{\min(3u, 10^6/u)}{4}\),这是可以计算的,大约几百万次,可行。

---
## **8. 实现这个方案**
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>
using namespace std;

const int LIM = 1000000;

int main() {
vector<int> cnt(LIM+1, 0);
for (int u = 1; u <= LIM; ++u) {
// 要求 u+v 是 4 的倍数,即 v ≡ (-u) mod 4
int r = (4 - (u % 4)) % 4; // v % 4 == r
int max_v = min(3*u - 1, LIM / u); // v < 3u 且 uv <= LIM
for (int v = r; v <= max_v; v += 4) {
if (v <= 0) continue;
int n = u * v;
if (n > LIM) break;
cnt[n]++;
}
}

int ans = 0;
for (int n = 1; n <= LIM; ++n) {
if (cnt[n] == 10) ans++;
}
cout << ans << endl;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---

**注意**:这计算的是每个 \(n\) 的解数,即满足条件的 \((u,v)\) 对数量,每个 \(u\) 对应一个等差数列解。

运行这个程序,应该会得到正确答案(根据题目例子,n=1155 时有 10 个解,我们这里计算的就是这样的 \(n\) 的个数)。
---

## **9. 最终答案**

运行后(我推理不实际运行),答案是 **??**(需要运行程序得到数值)。

根据 Project Euler 类似题(Problem 135),此题的答案(n<1e6 恰好 10 个解的数量)是 **4989**(但我不确定这是否是本题答案,因为题目例子中 n=1155 有 10 解,与 PE135 一致,而 PE135 问的是恰好 10 个解的数量,在 1e6 以下,答案是 4989)。

---

**最终建议**:使用上面修正后的代码,直接枚举 \(u\) 和 \(v\),就能得到正确结果。你的原始错误在于枚举范围不完整。

fun fact

GPT两发全挂(降智之后的),FluWA了三发,不知道为什么.