分析:大数区间素数,要用区间筛法
先看模板:
void segment_sieve(ll a,ll b)
{
for(int i = 0; (ll)i*i <= b; i++) is_prime_small[i] = true;
for(int i = 0; i <= b-a; i++) is_prime[i] = true;
for (int i = 2; (ll)i*i <= b; ++i){
if (is_prime_small[i]){
for (int j = 2*i; (ll)j*j <= b; j += i) is_prime_small[j] = false;
for (ll j = max(2ll,(a+i-1)/i)*i; j <= b; j += i) is_prime[j-a] = false;
}
}
}
这个模板中要求a >= 2,如果题目中a可以取到0或1的话,需要进行类似在筛选前把a赋值为2等操作.
AC代码:
/*
@Filename: code.cpp
@Version: 1.0
@Author: wyl6
@Email: 17744454343@163.com
*/
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <bitset>
#include <list>
#include <sstream>
#include <set>
#include <map>
#include <functional>
using namespace std;
#define INF 1000001 //质数差<=b-a
#define maxn 1000005 //b-a<=1000000
#define minn 100000 //根号b<100000
typedef long long ll;
ll l,u;
ll c1,c2;
ll d1,d2;
int mindis,maxdis;
bool is_prime[maxn];
bool is_prime_small[minn];
int prime[minn]; //质数数组
void segment_sieve(ll a,ll b)
{
for(int i = 0; (ll)i*i <= b; i++) is_prime_small[i] = true;
for(int i = 0; i <= b-a; i++) is_prime[i] = true;
for (int i = 2; (ll)i*i <= b; ++i){
if (is_prime_small[i]){
for (int j = 2*i; (ll)j*j <= b; j += i) is_prime_small[j] = false;
for (ll j = max(2ll,(a+i-1)/i)*i; j <= b; j += i) is_prime[j-a] = false;
}
}
if(a == 1) is_prime[0] = false;
}
int main()
{
while(cin >> l >> u)
{
segment_sieve(l,u);
int p = 0;
mindis = INF;
maxdis = 0;
for (int i = 0; i <= u-l; ++i){
if(is_prime[i]) prime[p++] = i;
}
if(p < 2) printf("There are no adjacent primes.\n");
else{
for(int i = 0; i < p-1; i++){
// cout << prime[i] << endl;
if (prime[i+1] - prime[i] < mindis){
mindis = prime[i+1] - prime[i];
c1 = prime[i]+l;
c2 = prime[i+1]+l;
// cout << c1 << " " << c2 << " " << mindis << endl;
}
if (prime[i+1] - prime[i] > maxdis)
{
maxdis = prime[i+1] - prime[i];
d1 = prime[i]+l;
d2 = prime[i+1]+l;
}
}
printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",c1,c2,d1,d2);
}
}
return 0;
}