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;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力

