码迷,mamicode.com
首页 > 其他好文 > 详细

prime distance ( 大区间内部质数

时间:2020-03-30 23:26:05      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:class   +=   problem   i++   www   https   blank   ems   两种   

# 题意

给定两个整数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.\n",pri[mn],pri[mn+1],pri[mx],pri[mx+1]);
45         }
46     }
47 }

 

prime distance ( 大区间内部质数

标签:class   +=   problem   i++   www   https   blank   ems   两种   

原文地址:https://www.cnblogs.com/hhyx/p/12601890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!