prime distance ( 大区间内部质数

Posted hhyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了prime distance ( 大区间内部质数相关的知识,希望对你有一定的参考价值。

# 题意

给定两个整数l,r,求在[l,r]区间内距离最近的一对相邻质数,和距离最远的一对相邻质数

l,r ∈ [1 , 231-1]

其中r-l <= 1e6

# 题解

l,r的范围很大,大约是2e9 线性算法也无法求出[1,r]的所有质数,但是r-l的范围小,

任何一个合数必定会包含一个不超过 √n 的质因数,所以求出 2~√r 的所有质数,

对于每个质数,将[l,r]中能整除这个数字的标记,剩下的就是区间内的质数。

对于质数两两比较求最值即可

复杂度 O (√r * log (log r))

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int N=1e6;
 5 ll primes[N],cnt;
 6 bool st[N];
 7 bool rec[N];
 8 ll pri[N],num;//位于 l~r 之间的质数
 9 void get_primes(int n){
10     memset(st,false,sizeof st);
11     for(int i=2;i<=n;i++){
12         if(!st[i]) primes[cnt++] = i;
13         for(int j=0;primes[j]<=n/i;j++){
14             st[primes[j] * i]=true;
15             if(i % primes[j] ==0 ) break;
16         }
17     }
18 }
19 int main(){
20     ll l,r;
21     while(cin>>l>>r){
22         get_primes(sqrt(r));
23         memset(rec,false,sizeof rec);
24         for(ll i=0;i<cnt;i++){
25             ll p=primes[i];
26             for(ll j = max(2*p,(l+p-1)/p*p);j<=r;j+=p){//第一个大于l的p的倍数,分两种情况,%p=0 和 %p != 0
27                 rec[j-l]=true;
28             }
29         }
30         num=0;
31         for(int i=0;i<=r-l;i++){
32             if(!rec[i] && i+l >1) // 1不是质数特判
33                 pri[num++]=i+l;
34         }
35 
36         if(num<2) puts("There are no adjacent primes.");
37         else {
38             int mx=0,mn=0;
39             for(int i=0;i<num-1;i++){
40                 int d = pri[i+1]-pri[i];
41                 if(d > pri[mx+1] - pri[mx]) mx=i;
42                 if(d < pri[mn+1] - pri[mn]) mn=i;
43             }
44             printf("%d,%d are closest, %d,%d are most distant.
",pri[mn],pri[mn+1],pri[mx],pri[mx+1]);
45         }
46     }
47 }

 

以上是关于prime distance ( 大区间内部质数的主要内容,如果未能解决你的问题,请参考以下文章

[题解](区间质数筛)POJ_2689 Prime Distance

UVA10140 Prime Distance

0x31 prime distance(质数)

POJ 2689 Prime Distance

196. 质数距离筛指定一个大区间内的质数

「一本通 6.2 例 1」Prime Distance