CF1474-B. Different Divisors
題意:
題目給出你一個\(d\),要求你找出一個數字\(y\),找到的\(y\)至少有四個整數因子並且任意兩個因子之間的差至少為\(d\)。
思路:
首先\(1\)是任何數字的因子,任何數自己本身也是自己的一個因子,所以我們只需要找到兩個差值不小於\(d\)的數字\(x_1, x_2\),並且\(min(x_1, x_2)\)與\(1\)的差值也不小於\(d\),那么第四個因子就是\(x_1*x_2\),也就是我們要找的\(y\)。所以最終答案就是\(y=1*(1+d)*(1+d+d)\).....嗎?這個答案看上去沒什么問題,但是再看一遍題目,要求任意兩個因子之間的差至少為\(d\),而\(y\)可能還有其他的因子,其他的因子的差可能會小於\(d\),所以這樣是不可以的。
但是這並不能說明這個方法是不可取的,如果取到的\(x_1, x_2\)除了\(1\)和它本身沒有其他的因子,那么\(y\)也就不會有除了\(1, x_1, x_2, y\)其他的因子了。而\(x_1, x_2\)取質數就可以很好的解決問題了。用質數篩篩出質數,兩次二分查找就能找到答案。
AC代碼:
#include <cstdio>
#include <algorithm>
typedef long long ll;
const int Maxn = 30005;
bool isPrime[Maxn];
int Prime[Maxn], cnt;
void getPrime(int n) {
isPrime[0] = isPrime[1] = true;
for (int i = 2; i <= n; i++) {
if (!isPrime[i]) {
Prime[cnt++] = i;
}
for (int j = 0; j < cnt && i * Prime[j] <= n; j++) {
isPrime[i * Prime[j]] = true;
if (i % Prime[j] == 0) {
break;
}
}
}
}
void solve() {
int d;
scanf("%d", &d);
int p1 = (int)(std::lower_bound(Prime, Prime + cnt, 1 + d) - Prime);
int p2 = (int)(std::lower_bound(Prime, Prime + cnt, Prime[p1] + d) - Prime);
ll ans = 1LL * Prime[p1] * Prime[p2];
printf("%lld\n", ans);
}
int main() {
getPrime(30000);
int T;
scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}
