当前位置: 首页 > news >正文

洛谷每日一题——P1036 [NOIP2002 普及组] 选数、P1045 [NOIP2003 普及组] 麦森数(高精度快速幂)

P1036 [NOIP2002 普及组] 选数

题目描述

[NOIP2002 普及组] 选数 - 洛谷

运行代码

#include <stdio.h>
int n, k, a[25], t;
int ss(int b) {int i;if (b < 2)return 0;for (i = 2; i * i <= b; i++)if (b % i == 0)return 0;return 1;
}
void dfs(int num, int sum, int j) {int i;if (num == k) {if (ss(sum))t++;return;}for (i = j; i < n; i++)dfs(num + 1, sum + a[i], i + 1);return;
}
int main() {int i;scanf("%d %d", &n, &k);for (i = 0; i < n; i++) {scanf("%d", &a[i]);}dfs(0, 0, 0);printf("%d", t);return 0;
}
改进后
  • 将判断一个数是否为质数的函数 ss 改名为 isPrime,使其功能更清晰易懂。
  • 在 dfs 函数中,将原本在全局变量中的 k 和数组 a 以及用于计数的 t 作为参数传递进去,这样可以使函数的独立性更强,不需要依赖全局变量,降低了代码的耦合度。
  • 在 isPrime 函数中,使用 sqrt(b) 来代替 i * i <= b,在判断一个数是否为质数时,只需要遍历到该数的平方根即可,这样可以稍微提高一些效率。
#include <stdio.h>
#include <math.h>// 判断一个数是否为质数
int isPrime(int b) {if (b < 2) return 0;for (int i = 2; i <= sqrt(b); i++) {if (b % i == 0) return 0;}return 1;
}// 深度优先搜索函数
void dfs(int num, int sum, int j, int k, int *a, int *t) {if (num == k) {if (isPrime(sum)) (*t)++;return;}for (int i = j; i < n; i++) {dfs(num + 1, sum + a[i], i + 1, k, a, t);}
}int main() {int n, k, a[25], t = 0;scanf("%d %d", &n, &k);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}dfs(0, 0, 0, k, a, &t);printf("%d", t);return 0;
}

代码思路

这段代码的主要目的是从给定的一组整数中选取 k 个整数,将它们相加,然后判断相加的和是否为质数,统计满足条件的组合数量。

  1. 数据读取与初始化

    • 在 main 函数中,首先通过 scanf 读取两个整数 n 和 k,其中 n 表示给定的整数数组 a 的长度,k 表示要从数组中选取的整数个数。
    • 接着通过循环使用 scanf 读取数组 a 中的每一个元素。
    • 同时初始化一个变量 t 为 0,用于统计满足条件(即选取的 k 个整数相加和为质数)的组合数量。
  2. 深度优先搜索(DFS)实现组合选取dfs 函数用于实现深度优先搜索来找出所有可能的 k 个整数的组合。它接受几个参数:

    • t:用于统计满足条件的组合数量(通过指针传递,以便在函数内部修改其值)。
    • a:给定的整数数组(从 main 函数传递过来)。
    • k:要选取的整数个数(从 main 函数传递过来)。
    • j:表示下一个可供选取的整数在数组 a 中的索引。
    • sum:表示当前选取的整数相加的和。
    • num:表示当前已经选取的整数个数。
    • 在 dfs 函数内部:
      • 当 num 等于 k 时,说明已经选取了 k 个整数,此时调用 isPrime 函数判断 sum 是否为质数,如果是,则将 t 的值加 1,然后返回。
      • 如果 num 不等于 k,则通过循环从索引 j 开始遍历数组 a,对于每一个元素 a[i],递归调用 dfs 函数,将 num 加 1(表示又选取了一个整数),sum 加 a[i](更新选取的整数相加的和),i + 1(更新下一个可供选取的整数的索引)。
  3. 判断质数函数

    • isPrime 函数用于判断一个数是否为质数。它接受一个整数 b 作为参数。
    • 如果 b 小于 2,则直接返回 0,因为小于 2 的数不是质数。
    • 然后通过循环从 2 开始遍历到 sqrt(b),如果在这个范围内发现 b 能被某个数整除(即 b % i == 0),则返回 0,说明 b 不是质数;如果遍历完整个范围都没有发现这样的数,则返回 1,说明 b 是质数。
  4. 结果输出:最后,在 main 函数中,通过 printf 输出统计得到的满足条件的组合数量 t

综上所述,该代码通过深度优先搜索遍历所有可能的 k 个整数的组合,然后判断每个组合的和是否为质数,从而统计出满足条件的组合数量。

P1045 [NOIP2003 普及组] 麦森数(高精度快速幂)

题目描述

[NOIP2003 普及组] 麦森数 - 洛谷

运行代码

#include <algorithm>
#include <cmath>
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
const int N = 500;
typedef vector<int> VI;
VI a(N), res(N);
int p;
VI mul(VI& a, VI& b) {VI t(N * 2);for (int i = 0; i < N; i++)for (int j = 0; j < N; j++) {t[i + j] += a[i] * b[j];t[i + j + 1] += t[i + j] / 10;t[i + j] %= 10;}return t;
}
void quick_pow(int p) {res[0] = 1, a[0] = 2;while (p) {if (p & 1)res = mul(res, a);a = mul(a, a);p >>= 1;}res[0]--;
}
int main() {cin >> p;printf("%d\n", int(p * log10(2)) + 1);quick_pow(p);for (int i = 0, k = 499; i < 10; i++) {for (int j = 0; j < 50; j++, k--)printf("%d", res[k]);puts(" ");}return 0;
}
改进后
  • 在 mul 函数中,将结果向量 t 的初始化大小改为根据输入向量 a 和 b 的大小动态确定,更加灵活且避免了可能的空间浪费。同时,在函数结尾添加了去除前导 0 的操作,使结果更加规范。
  • 在 quick_pow 函数中,将 res 和 a 的初始化放在函数内部,使函数更加独立,不需要依赖全局变量。并且将 res 作为参数传入,这样可以在函数内部直接修改其值,而不是像原来那样通过全局变量来操作。
  • 在 main 函数中,使用 cout 代替 printf,使代码风格更加统一(因为前面已经使用了 iostream 库)。同时,在输出结果时,对超出向量范围的情况进行了处理,即当索引小于 0 时输出 0,保证了输出的完整性。
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;// 高精度乘法函数,计算两个大整数向量的乘积
vector<int> mul(const vector<int>& a, const vector<int>& b) {vector<int> t(a.size() + b.size(), 0);for (size_t i = 0; i < a.size(); ++i) {for (size_t j = 0; j < b.size(); ++j) {t[i + j] += a[i] * b[j];t[i + j + 1] += t[i + j] / 10;t[i + j] %= 10;}}// 去除前导0while (t.size() > 1 && t.back() == 0) t.pop_back();return t;
}// 快速幂函数,用于计算2的p次方
void quick_pow(int p, vector<int>& res) {res = {1};vector<int> a = {2};while (p) {if (p & 1) res = mul(res, a);a = mul(a, a);p >>= 1;}res[0]--;
}int main() {int p;cin >> p;// 先输出结果的位数cout << static_cast<int>(p * log10(2)) + 1 << endl;vector<int> res;quick_pow(p, res);// 输出结果,每50个数字为一行for (int i = 0, k = res.size() - 1; i < 10; ++i) {for (int j = 0; j < 50; ++j, k--) {if (k >= 0) cout << res[k];else cout << 0;}cout << endl;}return 0;
}

代码思路

这段代码主要实现了两个功能:一是计算并输出 2 的 p 次方减 1 的结果(以高精度整数的形式),二是先输出这个结果的位数。

  1. 高精度乘法函数 mul

    • 目的是实现两个大整数(以 vector<int> 形式存储,每个元素代表整数的一位)的乘法运算。
    • 首先创建一个大小为 a.size() + b.size() 的结果向量 t,初始值都为 0
    • 然后通过两层嵌套的循环遍历两个输入向量 a 和 b 的每一位。对于每一对位 a[i] 和 b[j],将它们的乘积加到 t[i + j] 上。接着处理进位,将 t[i + j] 除以 10 的商加到 t[i + j + 1] 上,同时将 t[i + j] 除以 10 的余数保留在 t[i + j] 上。
    • 最后,通过循环去除结果向量 t 中的前导 0,得到规范的乘法结果并返回。
  2. 快速幂函数 quick_pow

    • 基于快速幂算法来计算 2 的 p 次方。快速幂算法的基本思想是通过不断地将指数减半,同时根据指数的奇偶性来决定是否将当前的中间结果与底数相乘,从而减少乘法运算的次数,提高计算效率。
    • 首先初始化 res 为只包含一个元素 1 的向量,表示 2 的 0 次方结果;初始化 a 为只包含一个元素 2 的向量,表示底数。
    • 然后在循环中,当 p 不为 0 时:
      • 如果 p 是奇数(即 p & 1 为真),则将当前的中间结果 res 与底数 a 相乘,更新 res 的值。
      • 然后将底数 a 自身相乘,更新 a 的值。
      • 最后将 p 除以 2(通过 p >>= 1 实现),继续下一轮循环。
    • 循环结束后,将 res 的第一个元素减 1,得到 2 的 p 次方减 1 的结果。
  3. 主函数 main

    • 首先通过 cin 读取输入的整数 p
    • 接着计算并输出 2 的 p 次方减 1 的结果的位数。根据对数的性质,一个数 N 的位数可以通过 log10(N) 来估算,对于 2 的 p 次方,其位数大约为 p * log10(2),再加上 1 是因为可能存在进位情况,所以通过 cout 输出 int(p * log10(2)) + 1
    • 然后调用 quick_pow 函数计算 2 的 p 次方减 1 的结果,并将结果存储在 res 向量中。
    • 最后,通过两层嵌套的循环将 res 中的结果以每 50 个数字为一行的方式输出。在循环中,先从 res 的末尾开始向前遍历,对于每一行,输出 50 个数字,如果遇到索引小于 0 的情况(即已经遍历完所有数字),则输出 0,保证每行输出的数字数量固定为 50 个。

综上所述,该代码通过高精度乘法和快速幂算法实现了对 2 的 p 次方减 1 的计算和输出,同时也给出了结果的位数估算。

相关文章:

洛谷每日一题——P1036 [NOIP2002 普及组] 选数、P1045 [NOIP2003 普及组] 麦森数(高精度快速幂)

P1036 [NOIP2002 普及组] 选数 题目描述 [NOIP2002 普及组] 选数 - 洛谷 运行代码 #include <stdio.h> int n, k, a[25], t; int ss(int b) {int i;if (b < 2)return 0;for (i 2; i * i < b; i)if (b % i 0)return 0;return 1; } void dfs(int num, int sum, …...

OpenHarmony开源鸿蒙

OpenHarmony_百度百科 2024年4 月 1 日&#xff0c;开源鸿蒙 OpenHarmony 4.1 Release 版本于昨日发布&#xff0c;开发套件同步升级到 API 11 Release...

2024.11.4 STM32点灯和简单的数据收发

1.发送函数 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); 参数1&#xff1a; UART 处理结构体的指针&#xff0c;该结构体包含了 UART 的所有配置参数。 参数2&#xff1a;要发送的数据指针 参数3&…...

Android Studio jcenter 停止服务,改用mavenCentral

随着jcenter在2021年2月28日停止服务&#xff0c;Android和Java开发者需寻找替代方案。推荐使用MavenCentral&#xff0c;可借助国内镜像加速。此外&#xff0c;jitpack.io也是一个选项&#xff0c;但对于大型项目&#xff0c;自建Nexus或MavenCentral更合适。迁移步骤包括更新…...

EasyPOI使用详解

EasyPOI 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法 文档&#xff1a;http://easypoi.mydoc.io/#categor…...

【云原生开发】K8S多集群资源管理平台架构设计

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

基于SpringBoot的城镇住房保障系统开发

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

一文解秘Rust如何与Java互操作

本博客所有文章除特别声明外&#xff0c;均采用CC BY-NC-SA 4.0许可协议。转载请注明来自 唯你 使用场景 JAVA 与 Rust 互操作让 Rust 可以背靠 Java 大生态来做更多事情&#xff0c;而 Java 也可以享受 Rust 语言特性的内存安全&#xff0c;所有权机制&#xff0c;无畏并发。…...

手机发展史介绍

手机&#xff0c;这个曾经在电影和科幻小说中出现的高科技产品&#xff0c;如今已经渗透进了我们生活的每个角落。从单纯的通讯工具到如今集成了通讯、娱乐、工作、社交等多种功能的智能终端&#xff0c;手机的发展史也是人类科技进步的缩影。本文将从手机的发展历程、技术革新…...

【ArcGISPro】单次将自己建立的工具箱添加至Arcpy中

新建工具箱 添加至Arcpy中 调用刚添加的工具箱...

docker镜像仓库常用命令

docker镜像仓库常用命令 docker logindocker logoutdocker pulldocker pushdocker searchdocker imagesdocker image inspectdocker tagdocker rmidocker image prunedocker savedocker loaddocker history docker login 语法: docker login [options] [server] 功能&#xff…...

springboot 传统应用程序,适配云原生改造

概述 2024年传统应用程序上云&#xff0c;改造方案 1、mysql 云环境高可用方案 2、redis 云环境高可用方案 3、nginx 云环境高可用方案 4、应用 云环境高可用方案1、mysql 云环境高可用方案 1.1 你先了解 1.1.1 你先了解“mysql高可用方案” 主从复制&#xff08;Master-S…...

D61【python 接口自动化学习】- python基础之数据库

day61 数据库定义 学习日期&#xff1a;20241107 学习目标&#xff1a;MySQL数据库-- 130&#xff1a;MySQL入门使用 学习笔记&#xff1a; 在命令提示符内先试用MySQL 使用图形化工具操作MySQL DBeaver安装 DBeaver连接MySQL 总结 MySQL安装成功后&#xff0c;可以使用命…...

数据库期末考试简答题

1&#xff0e;试述数据、数据库、数据库管理系统、数据库系统的概念。 答&#xff1a;&#xff08;1&#xff09;数据是数据库中存储的基本对象&#xff0c;是描述事物的符号记录。数据有多种表现形式&#xff0c;它们都可以经过数字化后存入计算机。数据的种类有数字、文字、…...

Java[面试题]-真实面试

1.什么是IOC和AOP&#xff1f;了解么&#xff1f; IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09; 1. IOC&#xff08;控制反转&#xff09; 概念 IOC&#xff08;Inversion of Control&#xff09;是面向对象编程中的一个设计原则&#xf…...

HTML5新增多媒体支持

一、引言 在当今数字化时代&#xff0c;丰富的多媒体内容对于网页的吸引力和用户体验至关重要。HTML5 的出现为网页带来了强大的多媒体支持&#xff0c;尤其是在音频和视频方面&#xff0c;为开发者和用户带来了全新的可能性。 二、音频audio标签 2.1 定义与属性详解 <a…...

K8S群集调度二

一、污点(Taint) 和 容忍(Tolerations) 1.1、污点(Taint) 设置在node上是对pod的一种作用 节点的亲和性&#xff0c;是Pod的一种属性&#xff08;偏好或硬性要求&#xff09;&#xff0c;它使Pod被吸引到一类特定的节点 而Taint 则相反&#xff0c;它使节点能够排斥一类特…...

43.第二阶段x86游戏实战2-提取游戏里面的lua

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…...

debian系统安装qt的时候 显示xcb相关文件缺失

如果是安装之后的问题 我们可以选择使用ldd的命令查看当前依赖的so那些文件确实 ldd /home/yinsir/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so 本人在进行打包的时候 出现则会个报错 ERROR: ldd outputLine: “libxcb-util.so.1 > not found” ERROR: for binary: “/…...

得物多模态大模型在重复商品识别上的应用和架构演进

重复商品治理介绍 根据得物的平台特性&#xff0c;同一个商品在平台上不能出现多个链接&#xff0c;原因是平台需要保证一品一链的特点&#xff0c;以保障商品的集中竞价&#xff0c;所以说一个商品在整个得物平台上只能有一个商详链接&#xff0c;因此我们需要对一品多链的情…...

纯音乐制作难题,智能创作轻松化解

前言&#xff1a;音乐人的创作困境&#xff0c;真的太戳心了 你有没有过这样的时刻&#xff1f;脑子里突然冒出一段超有感觉的旋律&#xff0c;想把它做成完整纯音乐&#xff0c;却被现实难题卡住&#xff1a;不懂编曲&#xff0c;不知道怎么搭配乐器&#xff1b;不会用专业软…...

仿真流程专题——基于Workbench的随机振动工程实践与3σ准则应用

1. 随机振动分析入门&#xff1a;从理论到工程实践 第一次接触随机振动分析时&#xff0c;我和大多数工程师一样感到困惑——这种"不确定"的载荷到底该怎么分析&#xff1f;经过多个项目的实战&#xff0c;我发现用生活中的例子最容易理解&#xff1a;想象你在颠簸的…...

2026年4K投影仪画质横评:明基W系列“色彩科学”解析

一、开篇点题&#xff1a;画质之争&#xff0c;终归是色彩之争2026年的4K投影仪市场&#xff0c;参数竞赛已进入白热化。当分辨率、亮度、对比度等硬指标逐渐趋同&#xff0c;真正拉开产品差距的&#xff0c;是那个决定画面灵魂的核心——色彩。一台投影仪能否精准还原电影导演…...

LinuxVLAN接口异常定位实战

LinuxVLAN接口异常定位实战这是一篇面向中级 Linux 使用者的技术文章&#xff0c;主题聚焦在VLAN接口&#xff0c;重点讨论链路隔离、子接口和二层网络划分。在真实生产环境中&#xff0c;VLAN接口相关问题往往不会以单一错误形式出现&#xff0c;而是混杂在日志、权限、资源状…...

Pixelle-Video全球化架构:智能AI短视频引擎的多语言解决方案

Pixelle-Video全球化架构&#xff1a;智能AI短视频引擎的多语言解决方案 【免费下载链接】Pixelle-Video &#x1f680; AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video Pixelle-Video作…...

不懂PMP的项目经理,正在被AI和敏捷时代淘汰

一、一个正在发生的残酷事实 张伟是一家传统制造企业的项目经理&#xff0c;拥有十年工作经验。他的日常工作是这样的&#xff1a;每天早上整理Excel进度表&#xff0c;中午开会协调资源&#xff0c;晚上更新甘特图&#xff0c;睡前发送项目周报。他觉得自己很忙、很重要。 直到…...

书匠策AI毕业论文功能全拆解:论文小白也能“一键开挂“的秘密武器,你还不知道?

各位正在被毕业论文折磨得头秃的同学们&#xff0c;先别急着焦虑&#xff0c;今天咱们来聊一个能让你从"对着空白文档发呆"直接跳转到"论文框架清晰可见"的神器——书匠策AI。 别被"AI"两个字吓到&#xff0c;这玩意儿说白了就是你的论文私人助…...

手把手教你用LwIP RAW API在STM32上实现一个能自动重连的TCP客户端

基于LwIP RAW API的STM32 TCP客户端自动重连实战指南 在物联网终端设备开发中&#xff0c;网络连接的稳定性直接决定了产品的可靠性。想象一下&#xff0c;一个部署在工厂车间的环境监测设备&#xff0c;如果因为Wi-Fi信号波动导致数据中断&#xff0c;可能让整个生产线失去关键…...

LeetCode 每日一题笔记 日期:2026.05.19 题目:2540. 最小公共值

LeetCode 每日一题笔记 0. 前言 日期&#xff1a;2026.05.19题目&#xff1a;2540. 最小公共值难度&#xff1a;简单标签&#xff1a;数组、双指针、哈希表 1. 题目理解 问题描述&#xff1a; 给定两个按非降序排序的整数数组 nums1 和 nums2&#xff0c;请返回它们的最小公共整…...

Steam账号被盗,手机邮箱都失效?别慌!我用支付宝账单截图成功找回(附详细客服案件创建流程)

Steam账号终极找回指南&#xff1a;当手机邮箱全失效时的支付宝账单申诉法 凌晨三点&#xff0c;盯着屏幕上"未找到关联账户"的红色提示&#xff0c;手指在键盘上悬停了十分钟——这是许多Steam玩家遭遇账号全维度被盗时的真实噩梦。当盗号者不仅修改了密码&#xf…...