题目链接:http://poj.org/problem?id=2689

题意:给出一个区间[L, R],找出区间内相连的,距离最近和距离最远的两个素数对。其中(1<=L<R<=2,147,483,647) R - L <= 1000000

思路:数据量太大不能直接筛选,要采用两次素数筛选来解决。我们先筛选出2 - 50000内的所有素数,对于上述范围内的数,如果为合数,则必定有2 - 50000内的质因子。换一句话说,也就是如果一个数没有2 - 50000内的质因子,那么这个数为素数。假设我们先预处理出2 - 50000内的所有素数,只需要从头到尾筛选一遍即可。

code:

 #include <cstdio>
#include <cstring>
typedef long long LL;
const int MAXN = ;
const int MAXM = ;
int primeA[MAXN]; // primeA[0]存放2-MAXN的素数个数 primeA[i]的值为第i个值
int primeB[MAXM]; // primeB[0]存放L-R的素数个数 primeB[i]的值为区间内第i个素数的值
bool isPrime[MAXM]; // 筛选出MAXN内的所有素数
void GetPrimeA()
{
memset(primeA, , sizeof(primeA));
for (int i = ; i < MAXN; ++i)
{
if (!primeA[i]) primeA[++primeA[]] = i;
for (int j = ; j <= primeA[] && primeA[j] * i < MAXN; ++j)
{
primeA[primeA[j] * i] = ;
if (i % primeA[j] == ) break;
}
}
} // 利用primeA筛选出primeB
void GetPrimeB(int L, int R)
{
memset(isPrime, true, sizeof(isPrime));
if (L < ) L = ; // 从第一个素数开始,一直到primeA[0],筛选出[L, R]内的素数
for (int i = ; i <= primeA[] && (LL)primeA[i] * primeA[i] <= R; ++i)
{
int s = L / primeA[i] + (L % primeA[i] > );
if (s == ) s = ; // 刚好为1,此时要筛选的数为素数
for (int j = s; (LL)j * primeA[i] <= R; ++j)
{
if ((LL)j * primeA[i] >= L)
isPrime[(LL)j * primeA[i] - L] = false; // j * primeA[i]显然不是素数,他有质因子primeA[i]
// 由于数据较大,可以利用相对L的距离来存这个数
}
}
primeB[] = ;
int len = R - L;
for (int i = ; i <= len; ++i)
{
if (isPrime[i])
primeB[++primeB[]] = i + L;
}
} int main()
{
GetPrimeA();
int L, R;
while (scanf("%d %d", &L, &R) == )
{
GetPrimeB(L, R);
if (primeB[] < )
{
printf("There are no adjacent primes.\n");
continue;
}
int x1 = , y1 = , x2 = , y2 = ;
for (int i = ; i < primeB[]; ++i)
{
if (primeB[i + ] - primeB[i] < y1 - x1)
{
x1 = primeB[i];
y1 = primeB[i + ];
}
if (primeB[i + ] - primeB[i] > y2 - x2)
{
x2 = primeB[i];
y2 = primeB[i + ];
}
}
printf("%d,%d are closest, %d,%d are most distant.\n", x1, y1, x2, y2);
}
return ;
}

POJ 2689 Prime Distance(素数筛选)的更多相关文章

  1. poj 2689 Prime Distance(区间筛选素数)

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9944   Accepted: 2677 De ...

  2. poj 2689 Prime Distance(大区间素数)

    题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...

  3. poj 2689 Prime Distance (素数二次筛法)

    2689 -- Prime Distance 没怎么研究过数论,还是今天才知道有素数二次筛法这样的东西. 题意是,要求求出给定区间内相邻两个素数的最大和最小差. 二次筛法的意思其实就是先将1~sqrt ...

  4. POJ 2689 Prime Distance (素数筛选法,大区间筛选)

    题意:给出一个区间[L,U],找出区间里相邻的距离最近的两个素数和距离最远的两个素数. 用素数筛选法.所有小于U的数,如果是合数,必定是某个因子(2到sqrt(U)间的素数)的倍数.由于sqrt(U) ...

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

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12811   Accepted: 3420 D ...

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

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12512   Accepted: 3340 D ...

  7. ZOJ 1842 Prime Distance(素数筛选法2次使用)

    Prime Distance Time Limit: 2 Seconds      Memory Limit: 65536 KB The branch of mathematics called nu ...

  8. POJ - 3126 Prime Path 素数筛选+BFS

    Prime Path The ministers of the cabinet were quite upset by the message from the Chief of Security s ...

  9. POJ 2689 Prime Distance (素数+两次筛选)

    题目地址:http://poj.org/problem?id=2689 题意:给你一个不超过1000000的区间L-R,要你求出区间内相邻素数差的最大最小值,输出相邻素数. AC代码: #includ ...

随机推荐

  1. android:configChanges 屏幕横竖屏切换

    出处:http://blog.csdn.net/djy1992/article/details/9378195 --->  android:screenOrientation="por ...

  2. android 抽屉式滑动demo

    下载地址:https://github.com/asijack/AndroidDrawerDemo 直接上效果图如下: 是不是还不错的样子. 先看看布局文件吧 <android.support. ...

  3. c# 第三方控件 闪退

    使用了第三方控件之后 出现了闪退的情况!  该第三方控件的软件没有注册或没有安装改第三方控件的软件

  4. SQL Server2008不允许修改表结构解决办法

    1.修改表结构遇到 2.点击取消 3.打开[工具]—[选项] 4.找到[Desiginers]标签,在右边找到“阻止保存要求重现创建表的更改”,取消勾选.

  5. Eclipse\MyEclipse 安装tomcat插件后,还需要配置Tomcat Home

    Eclipse 安装tomcat插件后,配置Tomcat Home的步骤如下: MyEclipse 安装tomcat插件后,配置Tomcat Home的步骤如下:

  6. KVC中setValuesForKeysWithDictionary:

    本文转载于:http://my.oschina.net/u/2407613/blog/524879?p={{page}} 从字典映射到一个对象,这是KVC中的一个方法所提供的,这个方法就是 setVa ...

  7. 星际SC地图制作中生成随机位置,也包括所有需要随机的效果

    星际SC地图制作中生成随机位置,也包括所有需要随机的效果 利用单位 kakaru T 开头那个, kakaru是随机变化位置 注意kakaru的放置位置和占用格子大小,kakaru周围放上LOCATI ...

  8. linux中的ps命令用法。

    在linux中使用ps命令可以查看有哪些进程在运行和运行的状态.进程是否结束.进程有没有僵尸.哪些进程占用了过多的资源等等. ps命令最常用的是用于监控后台进程的工作情况. 名称:ps 使用权限:所有 ...

  9. maven打包成第三方jar包且把pom依赖包打入进来

    <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId& ...

  10. JAVA的BIT数组

    写个小东西,要去重复数字,用到BIT数组,虽然JAVA已经提供了一个BitSet,不过自己手痒,又写了一个简单的 原理就不写了,网上一大堆 import java.util.Iterator; imp ...