POJ 2689

YEAH DONG DONG

终于过了。

这样思考,首先,要把所有素数求出来是不可能的。注意到L,R的差仅一百万,那么就可以只求这个范围内的素数了。而筛选范围内的素数,就可以用上一篇的方法,使用若n为合数,则必有素因子在sqrt(n)中。

在筛选范围内的素数2了一次,直接判断每个数是否素数,TLE。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;
const int LPR=50000;
const int Cprime=1000000;
const int inf=(1<<30);

bool isprime[LPR+10];
bool gsprime[Cprime+10];
__int64 prime[LPR],cp;
__int64 gprime[Cprime+10],gp;

void Isprime(){
	memset(isprime,true,sizeof(isprime));
	int e=(int)sqrt(LPR*1.0);
	isprime[0]=isprime[1]=false;
	for(int i=2;i<=e;i++){
		if(isprime[i]){
			for(int j=i*i;j<=LPR;j+=i)
			isprime[j]=false;
		}
	}
}

void Doprime(){
	cp=0;
	for(int i=1;i<=LPR;i++)
	if(isprime[i])
	prime[cp++]=i;
}
/*
void Fprime(__int64 tp){
	for(__int64 i=0;prime[i]*prime[i]<=tp;i++){
		if(tp%prime[i]==0) return ;
	}
	gprime[gp++]=tp;
}
*/
void Fprime(__int64 L,__int64 R){
	memset(gsprime,true,sizeof(gsprime));
	__int64 tp=L;
	if(L==1){
		gsprime[0]=false;
		L++;
	}
	for(__int64 i=0;i<cp;i++){
		if(prime[i]>R) break;
		__int64 s=L/prime[i];
		if(s*prime[i]<L)
		s++;
		bool flag=false;
		for(__int64 p=s*prime[i];p<=R;p+=prime[i]){
			if(s==1&&!flag){
				flag=true;
				continue;
			}
			gsprime[p-tp]=false;
		}
	}
	for(__int64 i=0;i<=R-tp;i++)
	if(gsprime[i])
	gprime[gp++]=i+tp;
}

int main(){
	__int64 L,R; __int64 mind,maxd; __int64 mil,mir,mal,mar;
	Isprime();
	Doprime();
//	cout<<prime[0]<<prime[1]<<prime[2]<<prime[3]<<endl;
	while(scanf("%I64d%I64d",&L,&R)!=EOF){
	//	cout<<L<<‘ ‘<<R<<endl;
		mind=inf; maxd=0;
		gp=0;
	/*	for(__int64 i=L;i<=R;i++){
			if(i==2){ gprime[gp++]=i; continue; }
			if(i%2==0) continue;
			Fprime(i);
		}*/
		Fprime(L,R);
		if(gp==0||gp==1)
		printf("There are no adjacent primes.\n");
		else {
			for(int i=0;i<gp-1;i++){
				if(gprime[i+1]-gprime[i]<mind){
					mind=gprime[i+1]-gprime[i];
					mil=gprime[i]; mir=gprime[i+1];
				}
				if(gprime[i+1]-gprime[i]>maxd){
					maxd=gprime[i+1]-gprime[i];
					mal=gprime[i]; mar=gprime[i+1];
				}
			}
			printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",mil,mir,mal,mar);
		}
	}
	return 0;
}

  

时间: 2024-10-11 06:56:59

POJ 2689的相关文章

POJ 2689 二次筛选(映射)

Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12303   Accepted: 3296 Description The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number th

POJ 2689 Prime Distance 素数筛选法应用

题目来源:POJ 2689 Prime Distance 题意:给出一个区间L R 区间内的距离最远和最近的2个素数 并且是相邻的 R-L <= 1000000 但是L和R会很大 思路:一般素数筛选法是拿一个素数 然后它的2倍3倍4倍...都不是 然后这题可以直接从2的L/2倍开始它的L/2+1倍L/2+2倍...都不是素数 首先筛选出一些素数 然后在以这些素数为基础 在L-R上在筛一次因为 R-L <= 1000000 可以左移开一个1百万的数组 #include <cstdio>

poj 2689 Prime Distance 【数论】【筛法求素数】

题目链接:传送门 题目大意: 给你L和R两组数,L和R的范围是2^32,其间隔(即R-L最大为1,000,000.) .让你求出L和R之间素数的最大间隔和最小的间隔. 比如 2 17.之间的最小素数间隔是2 3,最大的素数间隔是11 17. 要是直接进行一个2^32次方筛法然后在判断是会T的. 我们这样来想,筛法求素数的原理是什么: /**vis数组标记为0则说明是素数*/ int vis[10005]; void getPrimevis(int n) { int m=sqrt(n+0.5);

poj 2689 大范围内素数筛选

1 /** 2 给定一定范围求其内的素数 3 4 注意: 5 **/ 6 7 #include <iostream> 8 #include <math.h> 9 #include <cstring> 10 using namespace std; 11 #define maxn 1000000 12 long long prime[500000]; 13 long long cprime[500000]; 14 long long isprime[maxn+100];

poj 2689 Prime Distance(大区间筛素数)

http://poj.org/problem?id=2689 题意:给出一个大区间[L,U],分别求出该区间内连续的相差最小和相差最大的素数对. 因为L<U<=2147483647,直接筛素数是不行的,数组就开不了.但是可以根据素数筛的原理.我们先筛出sqrt(2147483647)以内的素数,然后拿这些素数去筛[L,U]之间的素数,即两次素数筛.但是L,U还是很大,但U-L<=1000000,所以进行区间平移,将[L,U]平移为[0,U-L],就能用数组放得下. #include &l

POJ 2689 - Prime Distance - [筛法求素数]

题目链接:http://poj.org/problem?id=2689 Time Limit: 1000MS Memory Limit: 65536K Description The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for thousan

POJ 2689 Prime Distance(素数筛选)

题目链接:http://poj.org/problem?id=2689 题意:给出一个区间[L, R],找出区间内相连的,距离最近和距离最远的两个素数对.其中(1<=L<R<=2,147,483,647) R - L <= 1000000 思路:数据量太大不能直接筛选,要采用两次素数筛选来解决.我们先筛选出2 - 50000内的所有素数,对于上述范围内的数,如果为合数,则必定有2 - 50000内的质因子.换一句话说,也就是如果一个数没有2 - 50000内的质因子,那么这个数为素

POJ 2689 Prime Distance(素数区间筛法--经典题)

大致题意:给定[L,R]区间,找出区间内的每个素数 数据范围 : 1<=L< R<=2,147,483,647) R-L <=1,000,000. R的数值太大,所以不能直接筛[0,R]的,要空间和时间优化,用到区间筛法,另外注意不能用int,因为R和L都是满int的,中间有很多细节处理会爆int的,还要注意1不是素数,所以在区间筛中要特判一下,是个易错的地方 //1160K 16MS C++ 1539B #include<cstdio> #include<ios

[ACM] POJ 2689 Prime Distance (筛选范围大素数)

Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12811   Accepted: 3420 Description The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number th