题意: 找到所有的正整数 x >= y, 使得1/k = 1/x + 1/y;
思路: 因为 x >= y, 有1/x <= 1/y, 因此1/k - 1/y <= 1/y, 即y <= 2*k, 所以我们枚举y的范围在2k之内即可, 然后计算x, 检验是否合法即可. 复杂度O(k), 其实进一布推到知枚举范围在 k + 1 ~ 2*k 之间……
AC Code
const int maxn = 1e3 + 5;
pii a[maxn];
int cal(int k) {
int cc = 0;
for (int i = k+1 ; i <= 2*k ; i ++) {
if (k*i % (i-k) == 0) {
a[++cc] = {i, k*i/(i-k)};
}
}
return cc;
}
void solve() {
int n;
while(~scanf("%d", &n)) {
int k = cal(n);
printf("%d\n", k);
for (int i = 1 ; i <= k ; i ++) {
int x = min(a[i].fi, a[i].se);
int y = max(a[i].fi, a[i].se);
printf("1/%d = 1/%d + 1/%d\n", n, y, x);
}
}
}