1. 程式人生 > 實用技巧 >CF1474-B. Different Divisors

CF1474-B. Different Divisors

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;
}