POJ 2689 (素数的二次筛选)
2013-09-19 16:39
344 查看
poj 2689 Prime Distance (素数筛选的经典应用)
题意:给出一个区间,长度<=1000 000;求其中素数相邻素数之间的差最小的和最大的;
算法:素数筛选
其中区间的数可能较大,因此如果用试除法的话,显然不行的;
用筛选法,首先第一次筛选出从1到47000之间的素数;第二次筛选时,利用第一次筛
选出来的素数,判断L到U区间范围内的数是否是素数;
因为范围是1<=L< U<=2,147,483,647,而U-L<=1000 000;所以我们可以设置一个1000000
以内的数组,用res[i-L]的值为0或者1来表示是否是素数;
核心算法是第二次的筛选,其中j=begin*prime[i]表示的是在A,B区间中prime[i]的第一个倍数;依次筛选;
题意:给出一个区间,长度<=1000 000;求其中素数相邻素数之间的差最小的和最大的;
算法:素数筛选
其中区间的数可能较大,因此如果用试除法的话,显然不行的;
用筛选法,首先第一次筛选出从1到47000之间的素数;第二次筛选时,利用第一次筛
选出来的素数,判断L到U区间范围内的数是否是素数;
因为范围是1<=L< U<=2,147,483,647,而U-L<=1000 000;所以我们可以设置一个1000000
以内的数组,用res[i-L]的值为0或者1来表示是否是素数;
核心算法是第二次的筛选,其中j=begin*prime[i]表示的是在A,B区间中prime[i]的第一个倍数;依次筛选;
/************* * POJ 2689 *************/ #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int SIZE = 50000; long long L, U; int yes[SIZE]; long long prim[SIZE]; int k=0; int adp[1001000]; void getPrim() { memset(yes,0,sizeof(yes)); for(long long i=2;i<SIZE;i++) if(!yes[i]) { prim[k++]=i; for(long long j=i*i;j<SIZE;j+=i) yes[j]=1; } } int main() { long long pre; long long maxV, u1, v1; long long minV, u2, v2; int flag; getPrim(); while(cin>>L>>U) { if(L<=1) L=2; //二次筛选过程 memset(adp,0,sizeof(adp)); for(int i=0;i<k&&prim[i]*prim[i]<=U;i++) { long long beg=L/prim[i]+(L%prim[i]>0); if(beg==1) beg++; for(long long j=beg*prim[i];j<=U;j+=prim[i]) //调整j,使得 L<=j<=U adp[j-L]=1; } maxV=-2*SIZE; minV=2*SIZE; flag=0; for(long long i=L;i<=U;i++) { if(!adp[i-L]) { flag++; if(flag>1) { int temp=i-pre; if(temp>maxV) {maxV=temp; u1=pre; v1=i;} if(temp<minV) {minV=temp; u2=pre; v2=i;} } pre=i; } } if(flag>1) cout<<u2<<","<<v2<<" are closest, "<<u1<<","<<v1<<" are most distant.\n"; else cout<<"There are no adjacent primes.\n"; } return 0; } /* 1 2 2146483648 2147483647 2147483047 2147483647 There are no adjacent primes. 2146483811,2146483813 are closest, 2146841093,2146841273 are most distant. 2147483053,2147483059 are closest, 2147483179,2147483237 are most distant. */
相关文章推荐
- poj 2689 (素数二次筛选)
- poj 2689 (素数二次筛选)
- poj 2689 Prime Distance 二次筛素数
- POJ 2689 Prime Distance(大区间素数筛选)
- poj 2689 巧妙地运用素数筛选
- 大区间素数筛选(POJ 2689)
- POJ - 2689 Prime Distance(大区间素数筛选)
- poj 2689 Prime Distance 筛法/二次筛法/区间素数
- poj 2689 Prime Distance (大素数的筛选)
- [ACM] POJ 2689 Prime Distance (大区间素数筛选)
- Poj 2689 Prime Distance(素数筛+二次素数筛)
- POJ 2689 Prime Distance (经典素数筛选)
- Prime Distance - POJ 2689 素数筛选
- Poj 2689 Prime Distance ----大区间素数筛选
- 给定范围的素数筛选(POJ 2689)
- POJ 2689 Prime Distance【大区间素数筛选】【埃氏筛法】【经典题】
- poj 2689(区间筛选素数。。。很经典)
- POJ 2689 Prime Distance 素数筛选法应用
- POJ 2689 Prime Distance 二次筛选
- 素数筛选(2次):poj2689 Prime Distance