# 题目大意
如果一个数 n,能够找到唯一一对 x,y (0<x<y),满足 x2+y2=n 的话,那么就称 n 为好数
现在,给你 n,请问,1→n 有多少好数?请你输出他们
# 数据范围
- 1≤n≤107
# 题解
这题实际上考的是预处理,我们只需要定义一个 cnt ,然后预处理出所有数可能出现的次数即可了,复杂度是 O(N2),可以接受
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
| from math import sqrt
N = 10 ** 7 + 10
cnt = [0 for _ in range(N)]
for i in range(1, int(sqrt(N))): j = i + 1 k = i * i num = k + j * j while num <= N - 10: cnt[num] += 1 j += 1 num = k + j * j
n = int(input())
res = [] for i in range(n + 1): if cnt[i] == 1: res.append(i)
print(len(res)) for i in res: print(i, end = ' ')
|