大区间素数筛选(POJ 2689)
/*
*POJ 2689 Prime Distance
*给出一个区间[L,U],找出区间内容、相邻的距离最近的两个素数和距离最远的两个素数
*1<=L<U<=2147483647 区间长度不超过1000000、就是要筛选出[L,U]之间的素数
*/ #include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <stack>
#include <algorithm>
using namespace std; const int MAXN = 100010;
int prime[MAXN+1];
void getPrime() {
memset(prime, 0, sizeof(prime));
for (int i = 2; i<=MAXN; i++) {
if (!prime[i])
prime[++prime[0]] = i;
for (int j = 1; j<=prime[0] && prime[j] <= MAXN/i; j++) {
prime[prime[j]*i] = 1;
if (i%prime[j] == 0)
break;
}
}
} bool notprime[1000010];
int prime2[1000010]; void getPrime2(int L, int R) {
memset(notprime, false, sizeof(notprime));
if (L < 2)
L = 2;
for (int i = 1; i<=prime[0]&& (long long)prime[i]*prime[i] <= R; i++) {
int s = L /prime[i] + (L%prime[i] > 0);
if (s == 1)
s = 2;
for (int j = s; (long long)j*prime[i] <= R; j++) {
if ((long long)j*prime[i] >= L)
notprime[j*prime[i]-L] = true;
}
}
prime2[0] = 0;
for (int i = 0; i<=R-L; i++) {
if (!notprime[i])
prime2[++prime2[0]] = i+L;
}
} int main() {
getPrime();
int L, U;
while (scanf("%d%d",&L,&U) == 2) {
getPrime2(L, U);
if (prime2[0] < 2)
printf("There are no adjacent primes.\n");
else {
int x1 = 0, x2 = 100000000, y1 = 0, y2 = 0;
for (int i = 1; i<prime2[0]; i++) {
if (prime2[i+1]-prime2[i] < x2-x1) {
x1 = prime2[i];
x2 = prime2[i+1];
}
if (prime2[i+1] - prime2[i] > y2-y1) {
y1 = prime2[i];
y2 = prime2[i+1];
}
}
printf("%d,%d are closest, %d,%d are most distant.\n",x1,x2,y1,y2);
}
} return 0;
}
大区间素数筛选(POJ 2689)的更多相关文章
- LightOJ1197 Help Hanzo —— 大区间素数筛选
题目链接:https://vjudge.net/problem/LightOJ-1197 1197 - Help Hanzo PDF (English) Statistics Forum Tim ...
- LightOJ 1197 LightOJ 1197(大区间素数筛选)
http://lightoj.com/volume_showproblem.php?problem=1197 题目大意: 就是给你一个区间[a,b]让你求这个区间素数的个数 但a.b的值太大没法直接进 ...
- 大区间素数筛选 POJ2689
题意: 给一个区间[L,U],(1<=L< U<=2,147,483,647),U-L<=1000000,求出[L,U]内距离近期和距离最远的素数对. 因为L,U都小于2^32 ...
- LightOj 1197 Help Hanzo (区间素数筛选)
题目大意: 给出T个实例,T<=200,给出[a,b]区间,问这个区间里面有多少个素数?(1 ≤ a ≤ b < 231, b - a ≤ 100000) 解题思路: 由于a,b的取值范围 ...
- poj 2689 Prime Distance(大区间素数)
题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...
- 2017ACM暑期多校联合训练 - Team 4 1003 HDU 6069 Counting Divisors (区间素数筛选+因子数)
题目链接 Problem Description In mathematics, the function d(n) denotes the number of divisors of positiv ...
- LightOJ 1197 Help Hanzo(区间素数筛选)
E - Help Hanzo Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit ...
- M - Help Hanzo LightOJ - 1197 (大区间素数筛法)
题解:素数区间问题.注意到a和b的范围是1<<31,所以直接暴力打表肯定不可以.如果一个数是合数,他的两个因子要么是两个sqrt(x),要么就分布在sqrt(x)两端,所以我们可以根据sq ...
- 素数筛 poj 2689
素数筛 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ...
随机推荐
- ecshop中的$user对象
ecshop的程序中,有个对象:$user,它是用来处理用户信息的.比如登录.注册,还有就是用来和第三方管理通讯和共享资源的.在user.php中,有一条$user->login($userna ...
- java二维码生成代码
QRCodeUtil.encode(text, "D:/004.jpg", "D:", true, "exp");// 这个方法的第一个参数 ...
- 496. Next Greater Element I
You are given two arrays(without duplicates)nums1andnums2wherenums1's elements are subset ofnums2. F ...
- linux下制作镜像文件
第一:制作iso镜像的方法: 把/dev/cdrom目录制作为镜像,名字为/root/rh1.iso 方法1:dd if=/dev/cdrom of=/root/rh1.iso 方法2:#cat /d ...
- Vue入门总结
技术栈:VUE:Vue-router:Vue-resource:Vue-cli: 项目:个人博客vue重构 一.vue-cli脚手架搭建项目结构 全局安装vue-cli: npm install vu ...
- 新手了解.Nat
1.Net平台 -->.Net平台 -->.Net FrameWrok框架 2.C#编程语言 -->编程语言:计算机能听懂的语言 -->使用.Net平台 C#是在.NEt平台 ...
- Golang 网络爬虫框架gocolly/colly 二 jQuery selector
Golang 网络爬虫框架gocolly/colly 二 jQuery selector colly框架依赖goquery库,goquery将jQuery的语法和特性引入到了go语言中.如果要灵活自如 ...
- NodeJS之微信开发
... 由于工作原因,太久没有写博客了,惭愧. 一直在说要买云服务器,前几天终于买了3个月,拿到之后就开始玩我最爱的nodejs,每天都是搞到12点1点过,乐此不疲啊. 从昨天开始玩的微信公众号,到今 ...
- Robot Framework学习笔记(三)------常用关键字介绍
下面关键字全部由 Builtin 库提供,Builtin 为 Robot Framework 标准类库.Builtin库提供常用的关键字 1.log log 关键字就是编程语言里的"prin ...
- 在macOS上通过pyenv安装和切换多版本Python
1. 安装homebrew 官网 http://brew.sh/index_zh-cn.html 打开终端,在终端中粘贴如下脚本 /usr/bin/ruby -e "$(curl -fsSL ...