大区间素数筛选(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; ...
随机推荐
- go编程之常见工具函数
1.时间格式化 基于模式的布局进行时间格式化和解析 package main import "fmt" import "time" func main() { ...
- 将Maven的Web项目部署到windows的Tomcat里
这里我用的是win7和tomcat8,且tomcat8下载的是压缩包而非安装文件. 第一步:先将tomcat8安装服务,cmd里更改目录为tomcat8(即压缩包解压后的那个文件夹)的bin文件夹, ...
- java 学习笔记之 流、文件的操作
ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import ...
- adb指令介绍
一.adb命令格式为:adb [-d|-e|-s <serialNumber>] <command> 1.adb devices :列出当前电脑所连接的所有安卓设备 2.adb ...
- Sum of odd and even elements
Given an integer N, you have to print the sum of odd numbers and even numbers form 1 to N Input:Firs ...
- IDLE3.6.3 Mac版不支持中文输入解决办法
最近安装了IDLE 3.6.3版本 但是在IDLE中要输入中文注释时发现虽然输入法切换到了中文,但输入的还是英文.然后我在IDLE外试了下,输入中文没问题,于是就确认应该是IDLE的问题. 网上查询到 ...
- day 10 字符编码和文件处理 细节整理
pycharm是文本编辑器. 大概理解为: 输出到屏幕上的时候,是解码过的字符串,用 decode 处理的时候要编码成相应的流, encode 成你要用的格式就可以了 1 .字符编码: 字符==== ...
- Python的locals()函数
Python的locals()函数会以dict类型返回当前位置的全部局部变量. 示例代码: def func(): arg_a, arg_b = 'a', 'b' def func_a(): pass ...
- vmware一步步安装centos
软件环境:vmware10.0破解版 centos版本:6.4 1.启动vmware,新建虚拟机,选择自定义安装 2,出现如下界面,保持默认,点击下一步 3.这个步骤要特别注意,选择“稍后安装”,我们 ...
- mysql如何执行关联查询与优化
mysql如何执行关联查询与优化 一.前言 在数据库中执行查询(select)在我们工作中是非常常见的,工作中离不开CRUD,在执行查询(select)时,多表关联也非常常见,我们用的也比较多,那么m ...