Skip to content
Author: lllyouo
Date: 20250701
tag: 欧拉筛
link: https://www.acwing.com/problem/content/198/

问题描述

link

分析

参考代码

cpp
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;
int primes[N], cnt = 0;
bool not_prime[N], st[N];

void get_primes(int n) {
    for (int i = 2; i <= n; i++) {
        if (!not_prime[i]) primes[++cnt] = i;

        for (int j = 1; j <= cnt && primes[j] <= n / i; j++) {
            not_prime[i * primes[j]] = true;
            if (i % primes[j] == 0) break;
        }
    }
} 

int main() {
    long long l, r; 
    while (cin >> l >> r) {
        if (l == 1) l = 2;

        memset(not_prime, 0, sizeof not_prime);
        memset(st, 0, sizeof st);
        get_primes(sqrt(r));
    
        for (int i = 1; i <= cnt; i++) {
            for (long long j = max(((l - 1) / primes[i] + 1) * primes[i], 2 * primes[i]); j <= r; j += primes[i]) {
                st[j - l] = 1;
            }
        }
        
        vector<int> v;
        for (int i = 0; i <= r - l; i++) {
        	if (!st[i]) v.push_back(i + l);
    	}
    	
    	if (v.size() <= 1) cout << "There are no adjacent primes." << endl;
    	else {
    	    int a, b, c, d;
    	    int minv = 1e9, maxv = 0;
    	    for (int i = 1; i < v.size(); i++) {
    	    	if (v[i] - v[i - 1] < minv) {
    	    		a = v[i - 1], b = v[i];
    	    		minv = b - a;
    			}
    			if (v[i] - v[i - 1] > maxv) {
    	    		c = v[i - 1], d = v[i];
    	    		maxv = d - c;
    			}
    		}
    		printf("%d,%d are closest, %d,%d are most distant.\n", a, b, c, d); 
    	}
    }

    return 0;
}