Acwing 196. 质数距离

/*
https://www.acwing.com/problem/content/198/

给定两个整数 L 和 U,你需要在闭区间 [L,U] 内找到距离最接近的两个相邻质数 C1 和 C2(即 C2−C1 是最小的),
如果存在相同距离的其他相邻质数对,则输出第一对。

同时,你还需要找到距离最远的两个相邻质数 D1 和 D2(即 D1−D2 是最大的),如果存在相同距离的其他相邻质数对,则输出第一对。

输入格式
每行输入两个整数 L 和 U,其中 L 和 U 的差值不会超过 106。

输出格式
对于每个 L 和 U,输出一个结果,结果占一行。

结果包括距离最近的相邻质数对和距离最远的相邻质数对。(具体格式参照样例)

如果 L 和 U 之间不存在质数对,则输出 There are no adjacent primes.。

数据范围
1≤L<U≤231−1
输入样例:
2 17
14 17
输出样例:
2,3 are closest, 7,11 are most distant.
There are no adjacent primes.
*/


#include <iostream>
#include <cstring>

using  namespace std;

const int N = 1000010;
long long pre[N], cnt;
bool vis[N];


long long a[N]; long long b[N];

int l, r;

void init() {
	int n = 60000;
	for (int i = 2; i <= n; i++) {
		if (!vis[i]) pre[cnt++] = i;
		for (int j = 0; pre[j] <= n / i; j++)
		{
			vis[pre[j] * i] = true;
			if (i % pre[j] == 0) break;
		}
	}
	memset(vis,0,sizeof vis);
}

void solve() {
	memset(a, 0, sizeof a);
	memset(b, 0, sizeof b);
	memset(vis, 0, sizeof vis);
	for (int i = 0; i <= r - l; i++) {
		a[i] = l + i;
	}
	if (l == 1) vis[0] = 1;
	for (int i = 0; i < cnt; i++) {
		long long currprime = pre[i];
		if (1LL*currprime * currprime > 1LL*r) break;
		long long start = 1LL*(l +currprime-1)/ currprime * currprime;
		if (start == currprime) start += start;
		if (start > r) continue;
		for (long long j = start; j <= r; j += currprime) {
			int idx = j - l;
			vis[idx] = 1;
		}
	}
	int bcnt = 0;
	for (int i = 0; i <= r - l; i++) {
		if (vis[i] == 0) {
			b[bcnt++] = a[i];
		}
	}

	int maxlen = 0; int maxa = -1, maxb = -1;	
	int minlen = 0x3f3f3f3f; int mina = -1, minb = -1;

	for (int i = 1; i < bcnt; i++) {
		int len = b[i] - b[i - 1];
		if (len > maxlen) {
			maxa = i; maxb = i - 1; maxlen = len;
		}
		if (len < minlen) {
			mina = i; minb = i - 1; minlen = len;
		}
	}

	if (maxa == -1 && maxb == -1) {
		printf("There are no adjacent primes.\n");
	}
	else {
		printf("%d,%d are closest, %d,%d are most distant.\n", b[minb], b[mina], b[maxb], b[maxa]);
	}
}

int main()
{
	init();
	while (cin >> l >> r) {
		solve();
	}

	return 0;
}

posted on 2025-03-17 11:35  itdef  阅读(15)  评论(0)    收藏  举报

导航