1 条题解
-
0
讨论 的奇偶性,利用通项 ,枚举 即可。
#include <bits/stdc++.h> using namespace std; int c[1000012], l[1000012], r[1000012], d[20000012]; int e[1000012], f = 0, g = 0; struct A { int a; int b; int c; }; A a[10000012]; bool cmp(A x, A y) { if (x.a != y.a) return x.a < y.a; if (x.b != y.b) return x.b < y.b; return x.c < y.c; } bool operator!=(A x, A y) { return (x.a != y.a || x.b != y.b || x.c != y.c); } signed main() { int n; cin >> n; for (int i = 1; i <= n; i++) for (int j = i; j <= n; j += i) c[j]++; for (int i = 1; i <= n; i++) { r[i] = r[i - 1] + c[i]; l[i] = r[i - 1] + 1; } memset(c, 0, sizeof c); for (int i = 1; i <= n; i++) for (int j = i; j <= n; j += i) { c[j]++; d[l[j] + c[j] - 1] = i; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= f; j++) e[j] = 0; f = 0; for (int j = l[i]; j <= r[i]; j++) for (int k = j; k <= l[i] + r[i] - j; k++) { f++; e[f] = d[j] * d[k]; } for (int j = 1; j <= f; j++) { long long u = 1ll * i * i / e[j]; if (u - e[j] > 2 * i && (u - e[j]) % 2 == 0 && u + e[j] <= 2 * n) { g++; a[g] = (A) {i, (u - e[j]) / 2, (u + e[j]) / 2}; } } } sort(a + 1, a + g + 1, cmp); long long ans = 0; for (int i = 1; i <= g; i++) if (a[i] != a[i - 1]) ans += a[i].c; cout << ans << endl; return 0; }
- 1
信息
- ID
- 64
- 时间
- 5000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 31
- 已通过
- 2
- 上传者