P1865 A % B Problem (素数筛法,前缀和)
题目描述
区间质数个数
输入输出格式
输入格式:
一行两个整数 询问次数n,范围m
接下来n行,每行两个整数 l,r 表示区间
输出格式:
对于每次询问输出个数 t,如l或r∉[1,m]输出 Crossing the line
输入输出样例
输入样例#1: 复制
2 5 1 3 2 6输出样例#1: 复制
2 Crossing the line说明
【数据范围和约定】
对于20%的数据 1<=n<=10 1<=m<=10
对于100%的数据 1<=n<=1000 1<=m<=1000000 -10^9<=l<=r<=10^9 1<=t<=1000000
第一眼肯定会想到素数筛法,但还需将此算法进行改进。
如果每一次记录当前这个数之前有几个是素数,则再求某一区间内的素数个数就变得极为容易。(注意:在求区间[L, R]内的素数个数时,不能直接用num[R] - num[L],显然这样减少一个计算了一个数。
例如:计算区间[2, 8]内的素数个数,
数字:1 2 3 4 5 6 7 8 9 10
前缀和:0 1 2 2 3 3 4 4 4 4
num[8] - num[2] = 4 - 1 = 3,显然是错的,所以应该减去他的前一个数的前缀和,即num[R] - num[L-1])
素数筛法模板(加计数素数前缀和)
void init(){memset(notprime, false, sizeof(notprime));memset(num, 0, sizeof(num));notprime[0] = notprime[1] = true;num[0] = 0; num[1] = 0;for(int i = 2; i < maxn; i++){if(!notprime[i]){num[i] = num[i-1] + 1;if(i > maxn/i) continue;for(int j = i*i; j < maxn; j += i)notprime[j] = true;}else num[i] = num[i-1];}
}
ac代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>using namespace std;
typedef long long LL;
const int maxn = 1e6+5;bool notprime[maxn];
int num[maxn];int n, m;
int l, r;void init(){memset(notprime, false, sizeof(notprime));memset(num, 0, sizeof(num));notprime[0] = notprime[1] = true;num[0] = 0; num[1] = 0;for(int i = 2; i < maxn; i++){if(!notprime[i]){num[i] = num[i-1] + 1;if(i > maxn/i) continue;for(int j = i*i; j < maxn; j += i)notprime[j] = true;}else num[i] = num[i-1];}
}int main()
{init();scanf("%d%d", &n, &m);while(n--){scanf("%d%d", &l, &r);if(l < 1||r > m) printf("Crossing the line\n");else printf("%d\n", num[r] - num[l-1]);}return 0;
}
P1865 A % B Problem (素数筛法,前缀和)相关推荐
- [数学/质数筛] 素数筛法
Date:2019/10/16?? 其实现在都快1点了,算是16号,啊?? 今天讲了素数的筛法 其实,在很小的数据范围内,不同的算法复杂度是差不多的,但是,如果处理几个数据,算法的作用就没有发挥出来 ...
- 线性筛法求素数c语言,[算法]素数筛法(埃氏筛法线性筛法)
一.素数筛的定义 给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选问题). 二.埃氏筛法(Eratosthenes筛法) 埃氏筛法又叫做Eratosthenes筛法 ...
- 埃拉托色尼素数筛法(转)
原文:http://blog.csdn.net/ltyqljhwcm/article/details/52835805 1.算法原理 埃拉托色尼素数筛法是有古希腊数学家发明的一种快速求解范围内所有的素 ...
- 斐波那契数列的3种求法及几种素数筛法
递推法 #include<stdio.h> long long sum[40];//也可以不用开数组 int main() {int n;scanf("%d",& ...
- P1217 [USACO1.5]回文质数 Prime Palindromes(素数筛法/打表)
P1217 [USACO1.5]回文质数 Prime Palindromes(素数筛法/打表) 一:埃氏筛(时间复杂度--nloglogn) 重点:一个数x是合数,则它的倍数也是合数 //用埃氏筛生成 ...
- 欧拉筛法原理C语言,素数筛法
素数筛 自古以来,素数就是一个有众多人研究的东西,而素数筛也是这些研究成果中的一个 素数筛是用来快速生成一个素数表的东西,比起生成素数的幼稚算法及其优化的方法,素数筛的速度更快,但是也常常会出现很多奇 ...
- C语言:素数筛法与分解素因数
一.素数筛法 素数筛法是关于求小于某个大数(正整数)的所有素数的算法,首先有理论:任何整数n≥2都可以分解成若干质数的乘积,即n=p1p2···pr. 用筛法求素数的基本思想是:把从1开始的.某一范围 ...
- 素数筛法(传统普通、朴素筛法、埃式筛法、欧拉筛法(线性筛))
素数筛法(普通.朴素筛法.埃式筛法.欧拉筛法) 1.题目 2.分析 3.代码 传统普通 朴素筛法 朴素筛法(6.14) 埃式筛法 埃式筛法(6.14) 欧拉筛法(线性筛) 欧拉筛法(线性筛 6.14) ...
- 素数判定(素数筛法)(欧拉)
这里主要说一下 素数筛法,该方法可以快速的选取出1~N数字中的所有素数.时间复杂度 远小于O(N*sqrt(N)) 方法为:从2开始,往后所有素数的倍数都不是素数.最后剩下的数都是素数. 再说说欧拉公 ...
最新文章
- 程序运行背后的那些事 ~ 【程序的编译(预处理操作)+链接】
- latex实现横竖均居中
- JavaScript代理模式
- 领域驱动设计在互联网业务开发中的实践
- DSP之GPIO(转)
- PAT:1042. Shuffling Machine (20) AC
- 欧盟批准ATT收购时代华纳 或年底前完成交易
- QT中让窗口屏幕居中的方法
- go sublime mysql_Sublime text 3开发GO
- 《JQuery 能干点啥~》第7讲 层级选择器_2
- 内存条引发的各类故障解析
- HTML复选框可以设置为只读吗?
- Google map API:查询地理位置和经纬度信息示例
- 钉钉添加自定义机器人,实现每周定时@某人
- 平安科技美国研究院院长韩玫:AI赋能传统行业,要知其然也知其所以然
- H5页面 禁止微信分享转发按钮
- 解决谷歌浏览器打开控制台有延迟
- 毕业入职2个月小感悟
- 为什么我愿意来北上广打拼?
- 数据分析 深入挖掘QQ空间的商业价值