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>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1000010;
typedef __int64 LL;
int vis[maxn];
int p[maxn];
int prime[maxn];
//筛素数
void sieve(int n)
{
	int m = sqrt(n+0.5);
	memset(vis, 0, sizeof(vis));
	vis[0] = vis[1] = 1;
	for(int i = 2; i <= m; i++)
		if(!vis[i])
			for(int j = i*i; j <= n; j += i)
				vis[j] = 1;
}

int get_primes(int n)
{
	sieve(n);
	int c = 0;
	for(int i = 2; i <= n; i++)
		if(!vis[i])
			prime[c++] = i;
	return c;
}
int main()
{
	LL L, R;
	int c = get_primes(100000);
	while(scanf("%I64d %I64d", &L, &R) != EOF)
	{
		if(L <= 2)
			L = 2;
		memset(p, 0, sizeof(p));
		for(int i = 0; i < c; i++)
		{
			if(prime[i] > R)
				break;
			LL t = L / prime[i];
			if(t <= 1)
				t = 2;
			LL j = t*prime[i];
			while(j < L)
				j += prime[i];

			for(; j <= R; j += prime[i])
			{
				//printf("%d,,", j);
				p[j-L] = 1;
			}
		}
		LL ans1 = 999999999, ans2 = 0;
		LL x1, y1, x2, y2, x = -1, y = -1;
		for(LL i = L; i <= R; i++)
		{
			if(!p[i-L])
			{
				//printf("%d\n", i);
				x = y;
				y = i;
				if(x != -1 && y != -1)
				{
					if(ans1 > y-x)
					{
						ans1 = y-x;
						x1 = x;
						y1 = y;
					}
					if(ans2 < y-x)
					{
						ans2 = y-x;
						x2 = x;
						y2 = y;
					}
				}
			}
		}
		if(x == -1 || y == -1)
		{
			puts("There are no adjacent primes.");
			continue;
		}
		printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.\n", x1, y1, x2, y2);
	}
	return 0;
}

POJ 2689 Prime Distance 素数筛选法应用,布布扣,bubuko.com

时间: 2024-12-27 23:57:52

POJ 2689 Prime Distance 素数筛选法应用的相关文章

POJ 2689 Prime Distance(素数筛选)

题意:输入区间[l,u],其中l和u为int范围的整数,区间最大为1000000.求出[l,u]中,相邻素数只差最大和最小的素数对.当存在多个时,输出较小的素数对. #include <iostream> #include <cstdio> #include <cstring> #define ll long long using namespace std; const int maxm=1e6+10; const int maxn=1e5+100; int prim

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 3978 Primes(素数筛选法)

题目 简单的计算A,B之间有多少个素数 只是测试数据有是负的 //AC //A和B之间有多少个素数 //数据可能有负的!!! #include<string.h> #include<stdio.h> //素数筛选法 int pri[100000+10];//1 合数, 0 素数 void Prime() { memset(pri,0,sizeof(pri)); pri[1]=pri[0]=1; for(int i=2;i<50002;i++) { if(pri[i]==0)

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内的质因子,那么这个数为素

[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

[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

poj 2689 Prime Distance(筛一个区间内的素数(或合数))

: [题意说明] 给你指定的范围[L, U],在这个范围内找出相邻最近和最远的两组质数,若最近或最远值相同,输出较小的那组.其中:1≤L,另U-L≤1000000. [问题分析] 此题与质数有关,显然若是能求出[L, U]之间的质数,然后从前往后扫描一遍即可出需要的结果,但问题是L与U的范围太大,是不可能在规定的时间内实现的. 但这里给我们提供了另一个条件:U-L≤1000000,如果我们只求1000000以内的素数,完全可以在规定的时间实现的!但由于所求的不是1-1000000以内的素数,所以

数论 - 素数的运用 --- poj 2689 : Prime Distance

Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12512   Accepted: 3340 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

Prime Distance 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 thousands of years is the question of primality. A prime number is a