poj 2689 Prime Distance (素数二次筛法)
没怎么研究过数论,还是今天才知道有素数二次筛法这样的东西。
题意是,要求求出给定区间内相邻两个素数的最大和最小差。
二次筛法的意思其实就是先将1~sqrt(b)内的素数先筛出来,然后再对[a,b]区间用那些筛出来的素数再次线性筛。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream> using namespace std; const int N = ;
int prm[N >> ], pn;
bool np[N]; void getbase() {
np[pn = ] = np[] = true;
prm[pn++] = ;
for (int i = ; i < N; i++, i++) {
if (!np[i]) prm[pn++] = i;
for (int j = , tmp; j < pn; j++) {
tmp = i * prm[j];
if (tmp >= N) break;
np[tmp] = true;
if (i % prm[j] == ) break;
}
}
// cout << pn << endl;
// for (int i = 0; i < 10; i++) cout << prm[i] << endl;
} bool mk[]; int main() {
// freopen("in", "r", stdin);
getbase();
int T;
long long a, b;
while (~scanf("%lld%lld", &a, &b)) {
a = max(2ll, a);
memset(mk, , sizeof(mk));
for (int i = ; i < pn && prm[i] <= b; i++) {
long long t = a / prm[i] * prm[i];
if (t != a) t += prm[i];
t = max(t, (long long) prm[i] << );
for ( ; t <= b; t += prm[i]) mk[t - a] = true;
}
long long p = a;
int mini = , maxi = -, minp, maxp;
while (p <= b && mk[p - a]) p++;
for (long long i = p + ; i <= b; i++) {
if (mk[i - a]) continue;
// cout << i << endl;
if (maxi < i - p) maxi = i - p, maxp = p;
if (mini > i - p) mini = i - p, minp = p;
p = i;
}
if (maxi < ) puts("There are no adjacent primes.");
else printf("%d,%d are closest, %d,%d are most distant.\n", minp, minp + mini, maxp, maxp + maxi);
}
return ;
}
——written by Lyon
poj 2689 Prime Distance (素数二次筛法)的更多相关文章
- poj 2689 Prime Distance(大区间素数)
题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...
- 数论 - 素数的运用 --- poj 2689 : Prime Distance
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12512 Accepted: 3340 D ...
- [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: 9944 Accepted: 2677 De ...
- POJ 2689 Prime Distance (素数+两次筛选)
题目地址:http://poj.org/problem?id=2689 题意:给你一个不超过1000000的区间L-R,要你求出区间内相邻素数差的最大最小值,输出相邻素数. AC代码: #includ ...
- 题解报告:poj 2689 Prime Distance(区间素数筛)
Description The branch of mathematics called number theory is about properties of numbers. One of th ...
- poj 2689 Prime Distance(大区间筛素数)
http://poj.org/problem?id=2689 题意:给出一个大区间[L,U],分别求出该区间内连续的相差最小和相差最大的素数对. 由于L<U<=2147483647,直接筛 ...
- POJ 2689 Prime Distance(素数筛选)
题目链接:http://poj.org/problem?id=2689 题意:给出一个区间[L, R],找出区间内相连的,距离最近和距离最远的两个素数对.其中(1<=L<R<=2,1 ...
- POJ 2689 Prime Distance (素数筛选法,大区间筛选)
题意:给出一个区间[L,U],找出区间里相邻的距离最近的两个素数和距离最远的两个素数. 用素数筛选法.所有小于U的数,如果是合数,必定是某个因子(2到sqrt(U)间的素数)的倍数.由于sqrt(U) ...
随机推荐
- 【JZOJ3636】【BOI2012】Mobile(mobile)
Mission 著名的手机网络运营商Totalphone 修建了若干基站收发台,以用于把信号网络覆盖一条新建的高速公路.因为Totalphone 的程序员总是很马虎的,所以,基站的传功功率不能独立设置 ...
- Docker.[4].容器操作.
Docker.[4].容器操作. 熟悉的指令: 启动容器 docker run 交互式启动容器 docker run -i -t IMAGENAME /bin/bash 停止容器 exit 停止容器 ...
- Leetcode872.Leaf-Similar Trees叶子相似的树
请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 . 举个例子,如上图所示,给定一颗叶值序列为 (6, 7, 4, 9, 8) 的树. 如果有两颗二叉树的叶值序列是相同 ...
- 微信端的user-Agent
在iPhone下,返回 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Ge ...
- Hashkell 第一篇
心情极差.................. 无事可做,其实是没心情去做事情,只好又翻起了haskell入门 记下几点,以备查询: 1. 函数名首字符是不可以大写的, 而且名称中可以有单引号,这也是合 ...
- Intersection of Two Linked Lists两链表找重合节点
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- python学习之旅1-2(基础知识)
三,python基础初识. 1.运行python代码. 在d盘下创建一个t1.py文件内容是: print('hello world') 打开windows命令行输入cmd,确定后 写入代码pytho ...
- cocos2dx3.0项目创建流程
cocos2dx3.0不是beta,新增了wp项目创建的支持 但不知道为啥非beta版本号的tools文件夹中取消了project-creator,可能有更改吧 没有这个工具还挺麻烦.就自己手动创建c ...
- JavaScript 开发的40个经典技巧
首次为变量赋值时务必使用var关键字 变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量. 使用===取代== ==和!=操作符会在需要的情况下自动转换数据类型.但===和 ...
- MUI - myStorage在ios safari无痕浏览模式下的解决方案
myStorage在ios safari无痕浏览模式下的解决方案 今天看到了这个帖子LocalStorage 在 Private Browsing 下的一个限制, 吓尿了,如果用户开启了无痕浏览,ap ...