AKOJ-1695-找素数
题意:
给定区间L,R。
计算区间中素数个数。
2 <= L,R <= 2147483647, R-L <= 1000000。
思路:
素数区间筛
先筛(2-sqrt(r))。
再用(2-sqrt(r))中的素数筛(l-r)。
代码:
1.自己写的区间筛,将筛2-sqrt(r) 分开了。
#include <iostream>
#include <string>
#include <queue>
#include <memory.h>
#include <math.h>
using namespace std;
typedef long long LL;
const int MAXN = 1000010;
int isPrimersmall[MAXN];
int isPrimer[MAXN]; int main()
{
LL l,r;
scanf("%lld%lld",&l,&r);
isPrimersmall[0] = 1;
isPrimersmall[1] = 1;
int x = sqrt(r);
for (int i = 2;i<=x;i++)
{
if (isPrimersmall[i] == 0)
{
for (int j = i * i; j <= x; j += i)
isPrimersmall[j] = 1;
}
}
for (int i = 2;i<=x;i++)
{
if (isPrimersmall[i] == 0)
{
for (int j = (int)((l + (i-1))/ i) * i;j <= r; j += i)
{
if (j != i)
isPrimer[j-l] = 1;
}
}
}
int sum = 0;
for (int i = 0;i<=r-l;i++)
{
if (isPrimer[i] == 0)
sum++;
}
printf("%d\n",sum); return 0;
}
2.将筛(2-sqrt(r))和(l-r)放在一起筛。
#include <iostream>
#include <string>
#include <queue>
#include <memory.h>
#include <math.h>
using namespace std;
typedef long long LL;
const int MAXN = 1000010;
int isPrimersmall[MAXN];
int isPrimer[MAXN]; int segement_sieve(LL a,LL b)
{
for (LL i = 0;i*i <= b;i++)
isPrimersmall[i] = 1;
for (LL i = 0;i <= b-a;i++)
isPrimer[i] = 1; for (LL i = 2;i*i <= b;i++)
{
if (isPrimersmall[i])
{
for (LL j = i*2;j*j <= b;j+=i)
isPrimersmall[j] = 0;
for (LL j = max(2LL,(a+i-1)/i) * i;j <= b ;j+=i)
isPrimer[j-a] = 0;
}
}
int sum = 0;
for (int i = 0;i <= b-a;i++)
if (isPrimer[i])
sum++;
return sum;
} int main()
{
LL a,b;
scanf("%lld%lld",&a,&b);
printf("%d\n",segement_sieve(a,b)); return 0;
}
AKOJ-1695-找素数的更多相关文章
- java实现找素数
** 找素数** 素数就是不能再进行等分的整数.比如:7,11.而9不是素数,因为它可以平分为3等份.一般认为最小的素数是2,接着是3,5,- 请问,第100002(十万零二)个素数是多少? 请注意: ...
- java多线程找素数实例
package ltb20180106; public class FindPrime implements Runnable{ private int prime; private int q; p ...
- 【NHOI2018】找素数
[题目描述] 素数又称质数,是指一个大于 1 的正整数,如果除了 1 和它本身以外,不能再被其它的数整除,例如:2.3.5.97 等都是素数.2 是最小的素数. 现在,给你 n 个数字,请你从中选取一 ...
- Demo03找素数
package Deom1;import java.awt.*;import java.util.Scanner;public class lx {//输入任意两个正整数,求出这两个正整数之间素数的个 ...
- Python 素数判断;以及默尼森数
1. 素数/质数 只能被2或者本身整除的正整数. 2. 默尼森数 P是素数且M也是素数,并且满足等式M=2^P-1,则称M为默尼森数. 编程小要求: 输出前5个默尼森数 1)最外层循环找素数 中间层循 ...
- java实现简单的素数判断
素数的这个问题由来已久,大学刚接触语言的时候遇到过找素数的问题,找工作笔试的时候也遇到过素数的问题,今天就特地写这篇博文,缅怀一下. 一.什么是素数? 除了1和它本身以外不再有其他的除数整除. 二.判 ...
- 数学#素数筛法 HDU 4548&POJ 2689
找素数本来是很简单的问题,但当数据变大时,用朴素思想来找素数想必是会超时的,所以用素数筛法. 素数筛法 打表伪代码(用prime数组保存区间内的所有素数): void isPrime() vis[]数 ...
- 枚举1--求小于n的最大素数
枚举1--求小于n的最大素数 总结: 素数是不能被比它小的素数整除. /* 枚举就是基于已有知识镜像答案猜测的一种问题求解策略 问题:求小于n的最大素数 分析: 找不到一个数学公式,使得根据N就可以计 ...
- 找小于N 的所有质数
笔试题目当中,找素数出现的几率有点大.昨天就做了一个,感觉不是很难,但可以考查程序员的数学和编码功底. 用嵌套循环来实现是很理想的,怎样减少循环的次数?怎样求出小于N的所有质数? 不可能将一个数除与所 ...
- 【练习总结】题目:筛法遍历素数(Java)
初学Java,学到流程控制的循环,有个练习题是暴力遍历素数. 因为看过av32186751,知道有个筛法,就想试试. 又受到线性筛法(一)--素数筛法(一) - nerd呱呱 - 博客园中,的这段启发 ...
随机推荐
- Nginx配置故障转移
当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用. 如果上游服务器的某一台宕机了,直接轮训到下一个~ 8080 8081 8082 关 ...
- c++程序书写原则
1.头文件中声明类,数据变量声明为私有,函数声明为公有. 2.所有函数实现放在非main.cpp文件中. 3.main.cpp只写函数的调用接口.
- Android studio 添加assets文件夹
我们知道Eclipse创建的工程默认是有个assets文件夹的,但是Android studio默认没有帮我们创建,那么我们就自己创建一个就好啦. (1)手动创建 在项目的顶部有个下拉,默认选择的是A ...
- hdu 6053(To my boyfriend)
-----------题目链接------------- 题目描述: 给定一个矩阵,定义\(f(A)\) 为矩阵中不同元素的个数.现在要求\(f(A)\)的期望. 解法: 首先来暴力的,复杂度大约:\ ...
- [Codeforces 787D] Legacy
[题目链接] https://codeforces.com/contest/787/problem/D [算法] 线段树优化建边 , 然后用Dijkstra算法求单源最短路 时间复杂度 : O((N ...
- codevs 4768跳石头
传送门 4768 跳石头 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在 ...
- 关于cuda 环境遇到的问题
1.error while loading shared libraries: libcudart.so.9.0: cannot open shared object file: No such fi ...
- Android开发--AndroidManifest.xml文件解析
参考文章:http://www.cnblogs.com/pilang/archive/2011/04/20/2022932.html 一.关于AndroidManifest.xml AndroidMa ...
- 爬虫库之BeautifulSoup学习(三)
遍历文档树: 1.查找子节点 .contents tag的.content属性可以将tag的子节点以列表的方式输出. print soup.body.contents print type(soup. ...
- 2.11 Hive中数据导入导出Import和Export使用
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ImportExport 一.Export.Import Export ...