CF1474-B. Different Divisors
阿新 • • 發佈:2021-01-20
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; }