2025年第十六届蓝桥杯软件赛省赛C/C++大学A组个人解题
文章目录
- 题目A
- 题目C:抽奖
- 题目D:红黑树
- 题目E:黑客
- 题目F:好串的数目
https://www.dotcpp.com/oj/train/1166/
题目A
找到第2025个素数
#include <iostream>
#include <vector> using namespace std; vector<int> primes = {2,3,5,7};
void init_primes(int n) { auto check_prime = [&](int x) { return std::all_of(primes.begin(), primes.end(), [x](int p) { return x % p != 0; }); }; int ii = primes.size(), x = primes.back() + 2; while (ii < n) { if (check_prime(x)) primes.push_back(x), ++ii; x += 2; }
} int main() { init_primes(2025); cout << primes.back() << endl; return 0;
}
题目C:抽奖
顾名思义
#include <iostream>
#include <vector>
#include <algorithm> using namespace std; typedef long long ll; vector<int> inputVecI(int n) { vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } return a;
} ll get_score(vector<int> &v) { if ((v[0] == v[1] and v[1] == v[2]) or (v[0] + 1 == v[1] and v[1] + 1 == v[2])) return 200;
// ranges::sort(v); std::sort(v.begin(), v.end()); if ((v[0] == v[1] or v[1] == v[2]) or (v[0] + 1 == v[1] and v[1] + 1 == v[2])) return 100; return 0;
} void solve() { int n, m; ll ans = 0; cin >> n; vector<int> a(n),b(n),c(n); int ia = 0, ib = 0, ic = 0; for (int i = 0; i < n; ++i) cin >> a[i]; for (int i = 0; i < n; ++i) cin >> b[i]; for (int i = 0; i < n; ++i) cin >> c[i]; cin >> m; for (int i = 0; i < m; ++i) { vector<int> v = inputVecI(3); ia = (ia + v[0]) % n; ib = (ib + v[1]) % n; ic = (ic + v[2]) % n; v[0] = a[ia], v[1] = b[ib], v[2] = c[ic]; ans += get_score(v); } cout << ans << endl;
} int main() { solve(); return 0;
}
题目D:红黑树
对于一颗红黑树具有的性质是:
- 下一层的左半行的颜色等于上一层。
- 每一层右半行的颜色和左半行的颜色相反。
- 左孩子和父结点颜色相同,右孩子和父节点颜色相反。
二叉树的性质:
对于一颗00开始编号的二叉树(顶点从0开始编号,行号从0开始编号),具有以下性质:
01 2
3 4 5 6
其节点<i,j>
(第i行,第j个)满足:
- 编号等于 2 i − 1 + j 2^i-1+j 2i−1+j
- 其父节点是
<i-1,[j/2]>
。如果j是偶数则是左孩子,奇数则是右孩子。
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std; typedef long long ll; void solve() { int n, m; cin >> n >> m; --n, --m; /* * 思路:回溯到根结点,再根据每次的孩子方向迭代颜色 * 优化:如果以0表示向左,1表示向右,则0--0 => 0, 0--1 => 1, 1--0==>0, 1--1 => 1。这其实就是异或运算。 */// stack<int> trace, direction; int color = 0; while (n >= 0) {
// trace.push(n);
// direction.push(m & 1); color ^= m & 1; --n; m >>= 1; } cout << (color ? "BLACK" : "RED") << endl; } int main() { int t;cin>>t; while (t--) solve(); return 0;
}
题目E:黑客
题意:
给一个长度为n+2的数组a,取a中的两个数作为矩阵长宽,求可以组合为多少种矩阵?
思路1:
我们二维的矩阵和它展开成一维是数组是1:1映射关系,因此我们只需要求,取两个长宽数后数组的排列数即可
首先将剩下的数组转为counter
枚举长宽,然后
根据排列组合原理计算排列数即可
例如我们有一个长度为9的数组
1 1 1, 2 2 2, 3, 4 4
它的排列数为
C 9 3 + C 6 3 + C 3 1 + C 2 2 C_{9}^{3} + C_{6}^{3} + C_{3}^{1} + C_{2}^{2} C93+C63+C31+C22
[!NOTE] 逆元
对于x满足 a ∗ x % p = 1 % p a*x\%p=1\%p a∗x%p=1%p,则称 x x x是 a a a的逆元(1逆元),记作 x = i n v ( a ) x=inv(a) x=inv(a)
如果我们把 % p \%p %p去掉,此时 x = 1 a x=\frac{1}{a} x=a1
模下除法必须用到1逆元
a b % p = a ∗ i n v ( b ) \frac{a}{b}\%p = a*inv(b) ba%p=a∗inv(b)
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
using namespace std;
//#define int long long
typedef long long ll;
const ll MOD = 1000000007; template<typename T>
T next() { T _; cin >> _; return _;
} // 快速逆元(快速幂求逆元)
ll quick_inv(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % MOD; a = a * a % MOD; b >>= 1; } return res;
} vector<ll> fac, inv; // 阶乘查询数组,逆元查询数组
void init_fac_and_inv(int n) { fac = vector<ll>(n+1), inv = vector<ll>(n+1); fac[0] = inv[0] = 1; for (int i = 1; i < n; ++i) { fac[i] = fac[i-1] * i % MOD; } inv[n-1] = quick_inv(fac[n-1], MOD-2); // 用费马小定理求逆元 for (int i = n - 2; i >= 1; --i) { inv[i] = inv[i+1] * (i + 1) % MOD; }
} // 求C(n,k) mod MOD
ll quick_comb(ll n, ll k) { if (k < 0 or k > n) return 0; return fac[n] * inv[k] % MOD * inv[n-k] % MOD;
} // 计算组合数
/*ll combination(ll n, ll m) { if (m > (n >> 1)) m = n - m; ll res = 1; for (ll i = 0; i < m; ++i) res *= n--; while (m > 1) res /= m--; return res;}
map<pair<ll,ll>, ll> cache_combination; // 缓存
ll comb(ll n, ll m) { pair<ll,ll> nm = make_pair(n,m); if (cache_combination.find(nm) != cache_combination.end()) return cache_combination[nm];// ll res = combination(n, m) % MOD; ll res = quick_comb(n, m) % MOD; cache_combination[nm] = res; return res;}*/ // 计算一个counter的组合数
ll comb_counter(const map<ll, ll> &counter, ll n) { ll res = 1; for (const auto &it: counter) { // res *= comb(n, it.second); res *= quick_comb(n, it.second); n -= it.second; res %= MOD; } return res;
} void solve() { ll n; ll ans = 0; cin >> n; init_fac_and_inv((int)n); map<ll, ll> counter; for (ll i = 0; i < n; ++i) ++counter[next<ll>()]; /* * 二维转一维,将矩阵看成是数组。 */ n -= 2; // n 为数组的实际长度 // 枚举矩阵可能的形状(r行c列) ll r_max = (ll) sqrt(n); for (ll r = 1; r <= r_max; ++r) {
// ll r = it.first; if (n % r) continue; // 不能被整除 ll c = n / r; if (r == c) { if (counter[r] >= 2) counter[r] -= 2; else continue; } else { if (counter[r] >= 1 and counter[c] >= 1) --counter[r], --counter[c]; else continue; }
// printf_s("matrix: %d %d\n", r, c); ans += (r == c ? comb_counter(counter, n) : comb_counter(counter, n) << 1); // 如果行列数不相等,我们把行列互换也可以得到一个相等的结果
// printf_s("> %lld\n", (r == c ? comb_counter(counter, n) : comb_counter(counter, n) << 1)); ans %= MOD; ++counter[r], ++counter[c]; } cout << ans << endl;
} int main() {
// ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); /*int t;cin>>t; while (t--)*/ solve(); return 0;
}
题目F:好串的数目
题意:
好串:能分割成2个非递减子串的串;长度为1的(1个字符)也是好串
给一个整数字符串,求它的子串是好串的数目。
思路:
排列组合原理
例如对于输入
1225568
我们先将它拆分成一个个非递减的子段
122 556 8
他们的长度分别是
3 3 1
对于这些子段:
- 我们取它的任意一个子串都是好串
- 例如对于
122
,122
12
22
1
等都是好串。一共有 C n 2 C_{n}^2 Cn2个(n是子段长度)
- 例如对于
- 对于两个相邻的子段,我们将它们组合再掐头去尾,也是好串
- 例如对于
122
+556
,12256
2556
等都是好串。一个有 n i − 1 ⋅ n i n_{i-1} \cdot n_{i} ni−1⋅ni个(n是子段长度)
- 例如对于
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std; typedef long long ll; void solve() { string s; cin >> s; vector<ll> a; ll ls = s[0] - '0', cnt = 0, ans = 0; for (char i : s) { int cur = i - '0'; if (cur == ls or cur == ls + 1) ++cnt; else a.push_back(cnt), cnt = 1; ls = cur; } a.push_back(cnt); for (int i = 0; i < a.size(); ++i) { if (i > 0) ans += a[i] * a[i-1]; ans += a[i] * (a[i] + 1) / 2; } cout << ans << endl;
} int main() { /*int t;cin>>t; while (t--)*/ solve(); return 0;
}
相关文章:
2025年第十六届蓝桥杯软件赛省赛C/C++大学A组个人解题
文章目录 题目A题目C:抽奖题目D:红黑树题目E:黑客题目F:好串的数目 https://www.dotcpp.com/oj/train/1166/ 题目A 找到第2025个素数 #include <iostream> #include <vector> using namespace std; vector<i…...
物理:人的记忆是由基本粒子构成的吗?
问题: 基因属于人体的一部分,记忆也是人体的一部分,那么为什么基因可以代际遗传,但是记忆却被清空重置。如果基因是由粒子构成,那么记忆是不是也应该由粒子构成?如果记忆是粒子构成的,那么能否说明记忆永恒,即使死亡了身体被分解了,那么只要保证其身体有关的所有粒子被…...
Memcached 的特性和使用场景介绍,以及集群搭建
以下是 Memcached 的特性和使用场景介绍,以及集群搭建的详细示例: 特性 高性能 内存存储:数据存储在内存中,读写速度极快。简单协议:使用基于文本的简单协议,通信高效。分布式架构 一致性哈希:采用一致性哈希算法,将数据均匀分布到多个节点,支持动态增减节点,减少数…...
uni-app,小程序中的addPhoneContact,保存联系人到手机通讯录
文章目录 方法详解简介 基本语法参数说明基础用法使用示例平台差异说明注意事项最佳实践 方法详解 简介 addPhoneContact是uni-app框架提供的一个实用API,用于向系统通讯录添加联系人信息。这个方法在需要将应用内的联系人信息快速保存到用户设备通讯录的场景下非…...

从数据中台到数据飞轮:数字化转型的演进之路
从数据中台到数据飞轮:数字化转型的演进之路 数据中台 数据中台是企业为整合内部和外部数据资源而构建的中介层,实现数据的统一管理、共享和高效利用,目标是打破信息孤岛,提高数据使用效率,支持业务决策和创新 实施成本…...
Spring Boot 注解详细解析:解锁高效开发的密钥
一、引言 Spring Boot 以其快速开发、自动配置等特性,成为构建 Java 应用程序的热门框架。而注解在 Spring Boot 中扮演着至关重要的角色,它们如同魔法指令,简化了配置流程,增强了代码的可读性与可维护性。本文将深入剖析 Spring…...

2025年5月-信息系统项目管理师高级-软考高项一般计算题
决策树和期望货币值 加权算法 自制和外购分析 沟通渠道 三点估算PERT 当其他条件一样时,npv越大越好...

zst-2001 上午题-历年真题 算法(5个内容)
回溯 算法 - 第1题 找合适的位置,如果没有位置就按B回家 d 分治 算法 - 第2题 b 算法 - 第3题 a 算法 - 第4题 划分一般就是分治 a 算法 - 第5题 分治 a 0-1背包 算法 - 第6题 c 算法 - 第7题 最小的为c 3100 c 算法 - 第8题 …...
【愚公系列】《Manus极简入门》036-物联网系统架构师:“万物互联师”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
3d关键点 可视化
目录 pygame pygame保存mp4 mayavi pygame import pygame from pygame.locals import * import numpy as np import sys# 初始化Pygame pygame.init() width, height 800, 600 screen pygame.display.set_mode((width, height)) clock pygame.time.Clock()# 生成示例数据…...

udp多点通信和心跳包
刷题 # UDP多点通信核心要点## 基础通信模式### 单播通信- 一对一通信方式- UDP默认通信模式- 地址指向具体目标主机### 广播通信- 一对多通信机制- 地址范围:xxx.xxx.xxx.255- 仅限局域网传输- 需设置SO_BROADCAST标志### 组播通信- 多对多群组通信- 地址范围&…...
什么是序列化与反序列化
序列化与反序列化:概念、作用及应用 一、基本定义 序列化(Serialization) 将 ** 对象的状态(数据、属性等)转换为可存储或传输的字节流(二进制或文本格式)** 的过程。 目的:使对象能…...

音视频学习:使用NDK编译FFmpeg动态库
1. 环境 1.1 基础配置 NDK 22b (r22b)FFmpeg 4.4Ubuntu 22.04 1.2 下载ffmpeg 官网提供了 .tar.xz 包,可以直接下载解压: wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.xz tar -xvf ffmpeg-4.4.tar.xz cd ffmpeg-4.41.3 安装基础工具链 sudo …...

如何使用 Qwen3 实现 Agentic RAG?
今天,我们将学习如何部署由阿里巴巴最新Qwen 3驱动的Agentic RAG。 这里是我们的工具栈: CrewAI用于代理编排。 Firecrawl用于网络搜索。 LightningAI的LitServe用于部署。 顶部的视频展示了这一过程。 图表显示了我们的Agentic RAG流程࿱…...

相机、雷达标定工具,以及雷达自动标定的思路
本篇我们来看一下自动驾驶传感器配置一个非常重要的模块,也就是传感器的标定。这里主要是对我之前修改的功能包的使用进行一个介绍. 对应的资源也已经上传了,0积分下载 安装 首先整个项目是使用ros1来进行启动的,但是要想正常编译,需要先安装三个对应的…...

vsomeip环境搭建保姆级教程
vsomeip环境搭建保姆级教程 ubuntu环境搭建 {% links %} site: VMware搭建ubuntu保姆级教程 url: https://zhuanlan.zhihu.com/p/1903219373906327339 desc: flechazo image: https://q1.qlogo.cn/g?b=qq&nk=2861099&s=5 color: “#9d5b8b” {% endlinks %} vsomei…...
【工具记录分享】提取bilibili视频字幕
F12大法 教程很多 但方法比较统一 例快速提取视频字幕!适用B站、AI字幕等等。好用 - 哔哩哔哩 无脑小工具 哔哩哔哩B站字幕下载_在线字幕解析-飞鱼视频下载助手 把链接扔进去就会自动生成srt文件 需要txt可以配合: SRT转为TXT...

我的MCP相关配置记录
1.VSCode的Cline中的MCP {"mcpServers": {"github.com/modelcontextprotocol/servers/tree/main/src/github": {"autoApprove": [],"disabled": false,"timeout": 60,"command": "cmd","args&quo…...
systemd vs crontab:Linux 自动化运行系统的全面对比
在 Linux 系统运维和开发中,任务调度与服务管理 是不可或缺的一环。无论是定期备份、日志轮转,还是启动后台服务,自动化机制都能极大地提高系统的可靠性与效率。两种最常用的自动化工具是: crontab:传统的基于时间的任…...

我们来学nacos -- 集群nacos2.5.1mysql8.4
2.5.1集群搭建 架构下载解压到3个文件夹初始化数据库&数据迁移检查端口可用配置cluster.confapplication.properties 使用mysql8.4的jar启动db.num is null报错datasource错误成功 nginx反向代理集群查看 架构 其中包含3个nacos节点,然后一个负载均衡器代理3个…...
计算机网络核心技术解析:从基础架构到应用实践
计算机网络作为现代信息社会的基石,承载着全球数据交换与资源共享的核心功能。本文将从网络基础架构、核心协议、分层模型到实际应用场景,全面解析计算机网络的核心技术,并结合行业最新趋势,为读者构建系统的知识体系。 一、计算机…...
Spring Boot 基于 Cookie 实现单点登录:原理、实践与优化详解
前言 在多系统交互的应用场景中,单点登录(SSO)能够显著提升用户体验,减少重复登录的繁琐操作。基于 Cookie 的单点登录方案,凭借其简单直观、浏览器原生支持的特性,成为快速实现单点登录的有效方式。本文将…...

Rollup入门与进阶:为现代Web应用构建超小的打包文件
我们常常面临Webpack复杂配置或是Babel转译后的冗余代码,结果导致最终的包体积居高不下加载速度也变得异常缓慢,而在众多打包工具中Rollup作为一个轻量且高效的选择,正悄然改变着这一切,本文将带你深入了解这个令人惊艳的打包工具…...
pdf url 转 图片
背景:vue2.0需要把pdf转成图片,显示在url里面,使用pdfjs-dist来解决 步骤: 1、安装依赖包(我的项目是node12,安装太高版本会报错) npm i pdfjs-dist2.16.105 2、vue代码 <template><div class"main…...

专题四:综合练习( 找出所有子集的异或总和再求和)
以leetcode1863题为例 题目分析: 找到每个子集,然后子集中的元素异或之后全部相加 算法原理分析: 画决策树:第一层为这个子集有一个元素 第二层这个子集有两个元素 从上往下罗列,把所有子集都罗列出来…...

STM32 修炼手册
第一章 计算机体系结构(了解) 后续在板子上开发的时候,需要考虑是否有操作系统 方式一:有操作系统,通过c库通过os api操作硬件方式二:无操作系统, 通过c库通过固件库操作硬件 第二章 STM32开发板概述 板子/开发板&…...

缓存(2):数据一致性
概述 一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大弱一致性:这种一致性级别约束了系统在写入成功…...
什么是原码和补码
补码的本质确实是模运算(Modular Arithmetic),这是理解补码为何能统一加减法的核心数学原理。下面用最通俗的语言和例子解释清楚: —### 1. 先理解什么是“模运算”- 模运算就是“周期性计数”,比如钟表: -…...

ppy/osu构建
下载 .NET (Linux、macOS 和 Windows) | .NET dotnet还行 构建:f5 运行:dotnet run --project osu.Desktop -c Debug...

基于几何布朗运动的股价预测模型构建与分析
基于几何布朗运动的股价预测模型构建与分析 摘要 本文建立基于几何布朗运动的股价预测模型,结合极大似然估计与蒙特卡洛模拟,推导股价条件概率密度函数并构建动态预测区间。实证分析显示模型在标普500指数预测中取得89%的覆盖概率,波动率估…...