算法
(数论、贪心、构造)
首先可以排除 $1, d + 1, 2d + 1, (d + 1)*(2d + 1)$ 这种错误做法,因为 $d + 1$ 或 $2d + 1$ 完全可以是合数。
所以虽然要求 $a$ 至少有 $4$ 个素因子,但实际上 $a$ 恰有 $4$ 个素因子才满足要求。
我们可以构造两个素数的乘积,而这两个素数分别是大于等于 $d + 1$ 的第一个素数,以及大于等于 $2d + 1$ 的第一个素数。
C++ 代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(c) begin(c), end(c)
#define lb(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define ub(c, x) distance((c).begin(), upper_bound(all(c), (x)))
using std::cin;
using std::cout;
using std::vector;
// linear sieve
vector<int> ps, pf;
void sieve(int mx) {
pf.resize(mx + 1);
rep(i, mx + 1) pf[i] = i;
for (int i = 2; i <= mx; ++i) {
if (pf[i] == i) ps.push_back(i);
for (int j = 0; j < ps.size() and ps[j] <= pf[i]; ++j) {
int x = ps[j] * i;
if (x > mx) break;
pf[x] = ps[j];
}
}
}
int main() {
sieve(1000000);
int t;
cin >> t;
while (t--) {
int d;
cin >> d;
int x = ps[lb(ps, d + 1)], y = ps[lb(ps, x + d)];
cout << x * y << '\n';
}
return 0;
}