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内的质因子,那么这个数为素数。假设我们先预处理出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(素数筛选)的更多相关文章
- poj 2689 Prime Distance(区间筛选素数)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9944 Accepted: 2677 De ...
- poj 2689 Prime Distance(大区间素数)
题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...
- poj 2689 Prime Distance (素数二次筛法)
2689 -- Prime Distance 没怎么研究过数论,还是今天才知道有素数二次筛法这样的东西. 题意是,要求求出给定区间内相邻两个素数的最大和最小差. 二次筛法的意思其实就是先将1~sqrt ...
- POJ 2689 Prime Distance (素数筛选法,大区间筛选)
题意:给出一个区间[L,U],找出区间里相邻的距离最近的两个素数和距离最远的两个素数. 用素数筛选法.所有小于U的数,如果是合数,必定是某个因子(2到sqrt(U)间的素数)的倍数.由于sqrt(U) ...
- [ACM] POJ 2689 Prime Distance (筛选范围大素数)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12811 Accepted: 3420 D ...
- 数论 - 素数的运用 --- poj 2689 : Prime Distance
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12512 Accepted: 3340 D ...
- ZOJ 1842 Prime Distance(素数筛选法2次使用)
Prime Distance Time Limit: 2 Seconds Memory Limit: 65536 KB The branch of mathematics called nu ...
- POJ - 3126 Prime Path 素数筛选+BFS
Prime Path The ministers of the cabinet were quite upset by the message from the Chief of Security s ...
- POJ 2689 Prime Distance (素数+两次筛选)
题目地址:http://poj.org/problem?id=2689 题意:给你一个不超过1000000的区间L-R,要你求出区间内相邻素数差的最大最小值,输出相邻素数. AC代码: #includ ...
随机推荐
- [原]基于CAS实现单点登录(SSO):cas client端的退出问题
自从CAS 3.4就很好的支持了单点注销功能,配置也很简单. 之前版本因为在CAS服务器通过HttpClient发送消息时并未指定为POST方式,所以在CAS客户端的注销Filter中没有收到POST ...
- poj2105---用指针对数组分块操作
#include <stdio.h> #include <stdlib.h> ; int pow1(int a,int b) { ,i; ) ; ;i<b;i++) { ...
- Oracle 11g新特性虚拟列分区
如今有个需求:一个单据表要依照月份来分区.假设是在Oracle 10g上,仅仅能再加一个字段. 在Oracle 11g以后就不一样了.能够用虚拟列处理. SQL> select * from v ...
- Python下载Bing主页图片
直接上代码: # -*- coding: cp936 -*- import urllib import os print 'Download data......' url = 'http://cn. ...
- JavaScript之怎样获取元素节点
JavaScript获取元素节点一共有三种方法,分别是通过元素ID.通过标签名字和通过类名字来获取: 1.通过元素ID属性的ID值来获得元素对象-getElementById() DOM提供了一个名为 ...
- springmvc+mybatis集成配置
简单之美,springmvc,mybatis就是一个很好的简单集成方案,能够满足一般的项目需求.闲暇时间把项目配置文件共享出来,供大家参看: 1.首先我们来看下依赖的pom: <!-- spri ...
- ThinkPHP第二十三天(Category表结构、PHPExcel导入数据函数)
1.category分类表表结构id,name,pid,sort,结合category.class.php类使用. 2.PHPExcel导入数据函数示例 function excel_to_mysql ...
- Lavarel(-) windows 部署
使用 Lavarel 开发完全可以抛开wamp,phpstudy等一键环境.因为lavarel 内置的artisan 整合了php5.4 内置的webserver ,甚至可以使用artisan 命令指 ...
- PHP开发APP接口
第1章 APP接口简介 - 课程简介 (:) - APP接口介绍 (:) - 客户端APP通信 (:) 最近学习 - 客户端APP通信格式区别 (:) - APP接口做的哪些事儿 (:) 第2章 封装 ...
- LaTeX空格
由于LaTeX 采用的是源文件编译方式, 默认LaTeX会忽略多余的空格, 如果需要产生一个空格,可以使用 命令 \, 注意代表的是空间键. 例如: Jones, et al.\ (1993), ...