洛谷P1835 素数密度

server/2025/2/5 7:28:24/

素数密度

题目背景

UPD:

  • 2024.8.12:加入一组 Hack 数据。

题目描述

给定 L , R L,R L,R,请计算区间 [ L , R ] [L,R] [L,R] 中素数的个数。

1 ≤ L ≤ R < 2 31 1\leq L\leq R < 2^{31} 1LR<231 R − L ≤ 1 0 6 R-L\leq 10^6 RL106

输入格式

第一行,两个正整数 L L L R R R

输出格式

一行,一个整数,表示区间中素数的个数。

样例 #1

样例输入 #1

2 11

样例输出 #1

5

题目分析:开始想到了欧拉筛法,但交上去发现wa只得了40分,了于是看数据范围发现然而我们并不能筛到 2e9,空间上也不允许,想想办法,因为2e9范围内的质数因子最大也到不了50000(用计算器或者代码sqrt一下2∼50000以内的素数,然后对于每一个数,筛出质因子的倍数,剩下的就是区间内的质数啦。

数学知识储备
【大于L,并且是p的倍数,最小整数是多少?】

#include <bits/stdc++.h>using namespace std;
typedef long long LL;int main() {//数学知识储备//【大于等于L,并且是p的倍数,最小整数是多少?】int p = 3;for (LL L = 100; L <= 200; L++)cout << max(2ll, (L - 1) / p + 1) * p << endl;return 0;
}

最后奉上代码部分:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;int primes[N];//存储所有素数 
bool vis[N],a[N];//vis存储i是否被筛掉 
//数组a记录偏移后的数据是不是合数,1:合数;0:质数。a[i]表示l+i是不是合数, 有一个偏移量l
ll l,r; 
int cnt; void get_primes()
{cnt = 0;for(int i = 2; i <= 50000; i++){if(!vis[i]) primes[cnt++] = i;for(int j = 0; primes[j] <= 50000 / i; j++){vis[primes[j] * i] = true;if(i % primes[j] == 0) break;}}
}ll read()
{ll s=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}return s*f;
}int main() {l = read(),r = read();l = l == 1 ? 2 : l;get_primes();for(int i = 0; i < cnt; i++){ll st = max(2ll,(l-1) / primes[i] + 1) * primes[i];for(ll j = st; j <= r; j += primes[i]) a[j - l] = true;}//区间范围,因为我们无法完全映射所有的区间,只能采用类似于偏移的办法对某段区间整体偏移l进行描述。int ans = 0;for (ll i = l; i <= r; i++) if (!a[i - l])ans++;printf("%d", ans);return 0;
}

http://www.ppmy.cn/server/165099.html

相关文章

Go语言指针的解引用和间接引用

在 Go 语言中&#xff0c;"解引用"和"间接引用"是与指针相关的概念。 解引用 (Dereferencing)&#xff1a; 解引用是指通过指针访问它所指向的变量的值。在 Go 中&#xff0c;使用星号&#xff08;*&#xff09;来解引用一个指针。 例如&#xff1a; v…

简单理解精确率(Precision)和召回率(Recall)

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 分类问题的评价指标&#xff1a;多分类【Precision、 micro-P、macro-P】、【Recall、micro-R、macro-R】、【F1、 micro-F1、macro-F1】 目标检测评估指标mAP&#xff1a;从Precision,Recall,到AP50-95【未完待续…

Python零基础快速入门课程,自带在线运行环境

Python零基础入门教程 编译器地址: Python在线编译器 课程目录: Python简介 Python是一种简单易学、功能强大的编程语言。它具有高效的数据结构,能够简单有效地实现面向对象编程。 Python的优点: 简单易学,所有人都可以零基础入门开源免费,有丰富的免费学习课程跨平台…

【数据结构】(4) 线性表 List

一、什么是线性表 线性表就是 n 个相同类型元素的有限序列&#xff0c;每一个元素只有一个前驱和后继&#xff08;除了第一个和最后一个元素&#xff09;。 数据结构中&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列。 二、什么是 List List 是 Java 中的线性…

docker gitlab arm64 版本安装部署

前言&#xff1a; 使用RK3588 部署gitlab 平台作为个人或小型团队办公代码版本使用 1. docker 安装 sudo apt install docker* 2. 获取arm版本的gitlab GitHub - zengxs/gitlab-arm64: GitLab docker image (CE & EE) for arm64 git clone https://github.com/zengxs…

具身智能-强化学习-强化学习基础-马尔可夫

文章目录 参考强化学习基础强化学习特点reward函数两种强化学习两种策略&#xff1a;探索&#xff08;Exploration&#xff09; vs. 利用&#xff08;Exploitation&#xff09;gym库的使用 马尔可夫马尔可夫过程马尔可夫奖励过程&#xff08;Markov Reward Process, MRP&#x…

浏览器同源策略:从“源”到安全限制的全面解析

一、什么是“源”&#xff08;Origin&#xff09;&#xff1f; 在浏览器中&#xff0c;“源”是 Web 安全的核心概念。一个“源”由三部分组成&#xff1a; 协议&#xff08;Protocol&#xff09;&#xff1a;如 http://、https://、ftp:// 域名&#xff08;Host&#xff09;…

有用的sql链接

『SQL』常考面试题&#xff08;2——窗口函数&#xff09;_sql的窗口函数面试题-CSDN博客 史上最强sql计算用户次日留存率详解&#xff08;通用版&#xff09;及相关常用函数 -2020.06.10 - 知乎 (zhihu.com) 1280. 学生们参加各科测试的次数 - 力扣&#xff08;LeetCode&…