大区间素数筛选(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; ...
随机推荐
- HNOI 2012 矿场搭建
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #def ...
- centOS7 mini配置linux服务器(四) 配置jdk
这里简单写一下centos7Mini 安装jdk1.8的全过程. 一.下载jdk,linux版本. 地址:http://www.oracle.com/technetwork/java/javase/ ...
- NodeJS初介
之前很多环境搭建中都使用到了Nodejs,所以这边对Nodejs做一个简单总结. 1.什么是Nodejs Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由R ...
- Java自己动手写连接池一
自己动手写连接池,废话不多说,直接上代码,读取配置文件 package com.kama.cn; import java.io.IOException;import java.io.InputStre ...
- 深入了解CSS字体度量,行高和vertical-align
line-height和vertical-align在CSS中是两个简单的属性.如此简单,大多数人都相信自己已经完全理解它们是如何工作的以及如何使用它们.但事实上并不如此.他们其实很复杂,也是CSS中 ...
- Python的locals()函数
Python的locals()函数会以dict类型返回当前位置的全部局部变量. 示例代码: def func(): arg_a, arg_b = 'a', 'b' def func_a(): pass ...
- swift4.0 正则表达式判断手机号
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Menlo; color: #ffffff; background-color: #282b3 ...
- [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析
本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...
- .NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接
众所周知在.NET下的RSA类所生成的密钥为Xml格式,而其他语言比如java一般使用pkcs8格式的密钥,JavaScript一般使用pkcs1格式.我们在开发过程中很可能遇到需要与其他语言开发的a ...
- Java框架之Hibernate(一)
一.Hibernate - 核心接口 它是 JBoss Community team (社区团队) 开发的.Hibernate 是一个开源的,对象关系模型框架 (ORM),它对JDBC进行了轻量的封 ...