标签: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 }
标签:class += problem i++ www https blank ems 两种
原文地址:https://www.cnblogs.com/hhyx/p/12601890.html