蓝桥杯 — — 数数

数数

友情链接:数数

题目:

在这里插入图片描述

思路:

这道题目主要用到了埃氏筛法(Sieve of Eratosthenes)来快速求解质数的方法,思路很巧妙,并且用到了动态规划的思想。

我们首先定义两个数组mkp,其中mk数组用于记录这个数是否为质数,或者说转换为这个数包含了几个质数。p数组用于记录所有的质数。

整体流程是这样的:

第一部分:

初始化mk数组的值为0,表示假设最开始每一个值都是质数,接着从质数 2开始进行遍历到题目说明的最大的值,对于每一个i的值,我们首先利用mk数组进行判断i是否为一个质数,如果是一个质数,那么这个质数只包含了它本身这一个质数,就令mk[i] = 1,然后将i压入数组p中去,然后执行下面的程序;如果i不是一个质数,那么这个i一定由前面的数转换而来 [ 1 ] ^{[1]} [1],此时的mk[i] != 0,就接着往下执行。

if(!mk[i]) { // 初始的时候值为0,表示是质数
    // 记录一次2的值是由一个质因数乘积而来的
    mk[i] = 1;
    p.push_back(i);
}

第二部分:

然后进行判断i的值是否在给定的范围内,如果在给定的范围内就接着判断mk[i]的值是否等于12,如果等于12,说明i的值包含了12个质数,就将答案进行+1操作。

// 如果i小于low
if(i >= low && mk[i] == 12){
    ans++;
} 

第三部分:

最后遍历到目前为止的所有质数,即遍历数组p,将数组p中的每一个值都与i进行相乘,如果得到的结果小于所给定的范围就令mk[p[k] * i] = mk[i]+ 1,这表示p[k] * i 的值是由转变为i的所有质数+1得到的,因为p[k]是一个质数,所以要在mk[i]的基础上进行+1操作。如果得到的结果大于所给定的范围,就结束遍历数组p的操作。

// 进行遍历之前累计的所有质数
for(auto v : p){
    if(v * i >= upper) break;
    mk[v * i] = mk[i] + 1;  // 在i的所有质数的基础上进行了+1,+1是因为对于v*i又多了一个质数v
}

解释一下 [ 1 ] ^{[1]} [1]处为什么i的值一定由前面的数转换而来。

我们可以这样思考:一开始对于 mk数组所有的值都是0,可以假定为初始的时候所有的值都是质数,然后我们从第一个质数2开始进行遍历,对于2,它一定是一个质数 ,因此它的值mk[2] = 1,表示2是由一个质数转化而来的,并将2压入到数组p中。对于第三部分,相当于是一个查询操作,对之后最近的非质数值进行了标记,比如现在p数组中只有一个值2,我们只能取到一个值2,然后标记2 * 2 = 4的值为非质数值,但是这一步是一个非常巧妙的过程,我们使用了一个式子mk[v * i] = mk[i] + 1,表示的是对于v * i的值是由多少个质数转变而来的,mk[i]表示的是i是由多少个质数转变而来的,+1表示的是在转变为i的质数个数的基础上又多了一个质数v。对于2而言,mk[2 * 2] = mk[2] + 1,表示的是4是由两个质数转变而来的分别是22,这样既标记了4不是一个质数,又标记了4包含了几个质数。在下一次遍历到4的时候就直接判断出4不是一个质数。

为了更好的理解,我们接着执行程序:

第二次循环i = 3,判断出3是一个质数(因为mk[3]的值是0),令mk[3] = 1,并将3压入到p数组中去,然后判断3小于给定的范围,程序往下执行,进行查询:mk[2 * 3] = mk[3] + 1 = 2mk[3 * 3] = mk[3] + 1 = 2

第三次循环i = 4,由于之前已经判断出mk[4] = mk[2] + 1 = 2了,所以4不是一个质数,程序往下执行,然后4小于给定的范围,程序往下执行,进行查询:mk[2 * 4] = mk[4] + 1 = 3mk[3 * 4] = mk[4] + 1 = 3,这就又标记出了812不是一个质数,并且83个质数的来(分别是组成4的质数22,和一个新的质数2),12也由三个质数得来(分别是组成4的质数,和一个新的质数3)。

⋮ \vdots

直到i的值在给定范围内是,判断mk[i]是否等于12,这也就是判断i的值是否由12个质数组成。如果是就进行累计,否则就继续向下执行。

整体的思路是:从前向后随着程序的推进标记出每一个非质数的值,并且标记出了每一个值是由几个质数组成的,如果这个数是一个质数,表示只有它本身组成。

代码:

#include<iostream>
#include<vector>
using namespace std;
 
void solve() {
	const long long low = 2333333, upper = 23333333;
	vector<int> mk(upper + 10, 0);  // 标记是否是质数或者是由几个质数转换而来的。
	vector<int> p;  // 用于记录所有质数
	int ans = 0;
	for(int i = 2; i <= upper; i ++) {
		if(!mk[i]) { // 值为0时,表示i是质数
			// 记录一次i的值是由一个质因数乘积而来的
			mk[i] = 1;
			p.push_back(i);
		}
		// 如果i小于low
		if(i >= low && mk[i] == 12){
			ans++;
		} 
		// 进行遍历之前累计的所有质数
		for(auto v : p){
			if(v * i >= upper) break;
			mk[v * i] = mk[i] + 1;  // 在i的所有质数的基础上进行了+1,+1是因为对于v*i又多了一个质数v
		}
	}
	cout<<ans<<endl;
	return ;
}


int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
	while(t--) {
		solve();
	}
	return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/541494.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LPA3399Pro搭建Qt开发环境

将以前的开发文档在此做一个记录。 一、介绍 Qt是一个跨平台的应用程序开发框架&#xff0c;支持多种操作系统和硬件架构&#xff0c;包括ARM架构的Linux。 RK3399Pro是一款基于ARM架构的处理器&#xff0c;用于嵌入式系统。可以在RK3399上搭建Qt开发环境&#xff0c;进行项目…

C语言学习笔记之结构体(一)

目录 什么是结构体&#xff1f; 结构体的声明 结构体变量的定义和初始化 结构体成员的访问 结构体传参 什么是结构体&#xff1f; 在现实生活中的很多事物无法用单一类型的变量就能描述清楚&#xff0c;如&#xff1a;描述一个学生&#xff0c;需要姓名&#xff0c;年龄&a…

演示:单包攻击,扫描类攻击,畸形报文攻击[Land攻击,泪滴攻击,ip地址欺骗]。配置防火墙进行防御

浏览上篇博客进行环境搭建 单包攻击 单包攻击&#xff08;Single Packet Attack&#xff09;是一种利用网络协议或应用程序中的漏洞进行的攻击方式。这种攻击通常只需要发送一个精心构造的数据包&#xff0c;就能够触发目标系统的漏洞&#xff0c;导致攻击者能够执行非授权的…

JVM修炼之路【12】- GC调优 、性能调优

上一篇中 我们详细讲了内存溢出 内存泄漏 还有相关的案例。 这篇博客中我们主要了解一下GC调优。 有些新手可能会有一点 疑问—— 这两者不是一回事吗&#xff1f;&#xff1f; 其实说一回事 也没错 因为GC调优本质上还是针对 堆上的内存 只不过前面我们关注的侧重点在于 不合…

关于机器学习中贝叶斯学习(Bayesian Learning)计算公式的理解

一、引言 在《统计学习的分类概述》中介绍了贝叶斯学习的概念和计算公式&#xff0c;可以看到这个公式就是概率统计理论中的贝叶斯公式&#xff0c;但在机器学习中这个公式与概率统计中的理解要复杂得多。 二、贝叶斯学习公式及各组成因子的含义 要理解贝叶斯学习公式&#…

【Spring Security】1.Spring Security介绍 功能介绍

文章目录 一、Spring Security介绍二、功能介绍 一、Spring Security介绍 官方文档&#xff1a;https://docs.spring.io/spring-security/reference/index.html 官网解释&#xff1a;Spring Security 是一个提供 身份验证、授权 和 针对常见攻击的保护 的框架。 它为 保护命令…

运放噪声评估的来龙去脉

运放噪声评估的来龙去脉 友情提示&#xff0c;运放电路的噪声分析还是比较复杂的&#xff0c;不论是基础理论还是对应的推导过程&#xff0c;都不是特别容易。考虑到兄弟们的基础参差不齐&#xff0c;所以我还是尽量说清楚点&#xff0c;这样导致看起来就有点罗里吧嗦&#xff…

刷题之动态规划-回文串

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的回文串类型相关的题目 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么>dp[i]表示什么状态转移方程&#xff1a; dp[i] 等于什么1 和 2 是动态规划的核心步骤&#xff0c;…

市场复盘总结 20240412

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率 50% 最常用的二…

iOS开发之为什么需要引用计数

iOS开发之为什么需要引用计数 在iOS开发中&#xff0c;Objective-C与Swift语言都是通过引用计数进行内存管理&#xff0c;实际上Python、Ruby、C等语言也提供了基于引用计数的内存管理方式&#xff0c;它们有一个共同点&#xff0c;那就是都是面向对象的编程语言。 引用计数可…

响应式布局(其次)

响应式布局 一.响应式开发二.bootstrap前端开发框架1.原理2.优点3.版本问题4.使用&#xff08;1&#xff09;创建文件夹结构&#xff08;2&#xff09;创建html骨架结构&#xff08;3&#xff09;引入相关样式&#xff08;4&#xff09;书写内容 5.布局容器&#xff08;已经划分…

Cascader 级联选择器 - 选择器最后一级数据为空

原因&#xff1a;将扁平数据转化为树形数据时&#xff0c;给每个项都添加了 children export const transList2Tree (list, rootPid) > {const result []list.forEach(item > {if (item.pid rootPid) {const children transList2Tree(list, item.id)item.children …

c语言多功能计算软件170

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 目录 题目 要求 主要代码片段 题目 设计一个计算器软件&#xff0c;具备如下功能提示界面。 要求 设计出界面&#xff0c;注意界面名称最后为自己的姓名&#xff1b;&#xff08;20分&#xff09;能够实现加、减、乘、…

【Godot4.2】CanvasItem绘图函数全解析 - 3.绘制纹理

概述 前两节我们讲述了常见几何图形绘制以及对几何图形应用变换的基础知识。 本节我们来讲如何在CanvasItem中绘制纹理。 系列目录 0.概述1.绘制简单图形2.设定绘图变换3.绘制纹理4.绘制样式盒5.绘制字符和字符串6.TextLine和TextParagraph详解7.自定义节点TextBoard8.绘制点…

C语言 函数——函数封装与程序的健壮性

目录 函数封装&#xff08;Encapsulation&#xff09; 如何增强程序的健壮性&#xff1f; 如何保证不会传入负数实参&#xff1f; 函数设计的基本原则 函数封装&#xff08;Encapsulation&#xff09; 外界对函数的影响——仅限于入口参数 函数对外界的影响——仅限于一个…

MySQL前缀索引(3/16)

前缀索引 前缀索引&#xff1a;MySQL支持前缀索引&#xff0c;允许定义字符串的一部分作为索引。如果不指定前缀长度&#xff0c;索引将包含整个字符串。前缀索引可以节省空间&#xff0c;但可能会增加查询时的记录扫描次数&#xff08;因为会查询到多个前缀相同的数据&#x…

MySQL数据库的增删改查(进阶)

1.新增 将一个表中的内容插入到另一个表中. 这里需要确保查询集合的列数,类型,顺序要和插入表的列数,类型,顺序一致,这里列的名称可以不一样. values 替换成了select 查询的临时表. 2. 查询 2.1 聚合查询 2.1.1 聚合查询 函数 说明COUNT([DISTINCT] expr)返回…

python爬虫--------Beautiful Soup 案列(二十一天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

同城O2O系统搭建实战:外卖跑腿APP发全攻略

在同城服务领域&#xff0c;外卖和跑腿服务成为了人们生活中不可或缺的一部分。接下来小编将带领读者进入同城O2O系统搭建的实战领域&#xff0c;详细介绍如何打造一款外卖跑腿APP。 第一步&#xff1a;需求分析 这包括对目标用户群体的调研&#xff0c;明确用户的需求和痛点。…

FreeFileSync|本地自动备份设置教程,终于可以不用手动同步了

前言 昨天小白给各位小伙伴分享了FreeFileSync软件&#xff0c;由于篇幅过长&#xff0c;所以整个教程中并没有教小伙伴们如何设置自动同步的办法。 今天小白就来唠唠&#xff1a;如何让FreeFileSync自动同步。 教程分为几种&#xff1a; 开机自动同步 开机之后自动执行一次…