X进制减法(蓝桥杯)

news2024/11/25 0:47:12

文章目录

  • X进制减法
    • 题目描述
    • 解题思路
    • 贪心算法+模拟减法(大数相减)

X进制减法

题目描述

进制规定了数字在数位上逢几进一。

X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则X 进制数 321 转换为十进制数为 65。

现在有两个 X 进制表示的整数 A 和 B,但是其具体每一数位的进制还不确定,只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进制。请你算出 A B 的结果最小可能是多少。

请注意,你需要保证 A 和 B 在 X 进制下都是合法的,即每一数位上的数字要小于其进制。

输入格式

第一行一个正整数 N,含义如题面所述。

第二行一个正整数 Ma,表示 X 进制数 A 的位数。

第三行 Ma 个用空格分开的整数,表示 X 进制数 A 按从高位到低位顺序各个数位上的数字在十进制下的表示。

第四行一个正整数 Mb,表示 X 进制数 B 的位数。

第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各
个数位上的数字在十进制下的表示。

请注意,输入中的所有数字都是十进制的。

输出格式

输出一行一个整数,表示 X 进制数 A B 的结果的最小可能值转换为十进制后再模 1000000007 的结果。

样例输入

11
3
10 4 0
3
1 2 0

样例输出

94

样例说明

当进制为:最低位 2 进制,第二数位 5 进制,第三数位 11 进制时,减法得到的差最小。此时 A 在十进制下是 108,B 在十进制下是 14,差值是 94。

X进制数321转换为十进制数为65.
65=3*(2*10)+2*(2)+1*(1)

评测用例规模与约定

对于 30% 的数据,N ≤ 10; Ma, Mb ≤ 8.

对于 100% 的数据,2 ≤ N ≤ 1000; 1 ≤ Ma, Mb ≤ 100000; A ≥ B.

解题思路

对于输入样例,若选取第三数位11进制,第二数位5进制,第一数位2进制
在这里插入图片描述
计算规则上所示,每个数位可任意选择一个进制(要求进制数大于当前位数的数值,例如当前位数的数位5,那么最小的进制数只能为6

考虑A-B要求最小,贪心考虑,即要满足每一位数的进制数要最小,因此很容易得出,每一数位的进制数大小是多少(A,B对位后,取数位上的数值最大的一个+1即为当前数位的进制位,如果取最小的,那另一个数就不满足该进制),但注意最低为2进制,因为不存在1进制。

样例

10 4 0
1  2 0

最高位分别为10和1,那么该数位取10+1=11进制
次高位分别为4和2,那么该数位取4+1=5进制
最低位分别为0和0,那么该数位取2进制

最后数位对齐,模拟减法即可


重点:贪心、理解进制、模拟减法


贪心算法+模拟减法(大数相减)

这段代码的目的是计算两个特定进制(X进制)数A和B之间的差,并将这个差以十进制数表示,最后对结果取模1000000007。这个特定的进制系统比较复杂,因为它允许每一位数的进制不同,从二进制开始,最高可达N进制。下面是对代码各个部分的详细注释和执行流程解释。

// 引入所有标准库
#include<bits/stdc++.h>
// 使用标准命名空间
using namespace std;

// 定义模数
const int mod=1000000007;
// 数组a,b用于存储两个输入数A和B,数组s用于存储每位的最小可能进制
long long a[100010],b[100010],s[100010];
// n为最高进制,ma和mb分别为A和B的位数
int n,ma,mb;

// 函数sub用于执行具体的减法操作并返回结果
vector<long long> sub() {
    // base用于进位处理,初始为1
    long long base=1;
    vector<long long> c; // 存储计算结果
    long long t=0; // 临时变量t用于处理借位和计算过程中的中间结果
    // 遍历所有位进行减法操作
    for(int i=0;i<ma;i++) {
        t=a[i]-t; // 减去之前的借位
        if(i<mb) t-=b[i]; // 如果B有对应位,则减去B的值
        // 计算当前位的值,并考虑进制转换和模运算
        c.push_back(((t+s[i])%s[i])*base%mod);
        // 更新借位
        if(t<0) t=1;
        else t=0;
        // 更新base,用于下一位的计算
        base=(base*s[i])%mod;
    }
    // 移除结果中末尾的0,保留有效数字
    while(c.size()>1&&c.back()==0) c.pop_back();//这里可以省略,因为后面需要相加,0+0=0
    // 返回计算结果
    return c;
}

int main() {
    // 输入处理
    cin>>n>>ma;
    for(int i=ma-1;i>=0;i--)
        cin>>a[i];
    cin>>mb; 
    for(int i=mb-1;i>=0;i--)
        cin>>b[i];
    // 计算每位的最小可能进制
    for(int i=ma-1;i>=0;i--)//因为A>=B,所以得出ma>=mb
        s[i]=max(max(a[i],b[i])+1,(long long)2);
    
    // 调用sub函数计算A-B的结果
    auto c=sub();
    // 将结果转换为十进制并取模
    long long ans=0;
    for(int i=c.size()-1;i>=0;i--)
        ans=(ans+c[i])%mod;
    // 输出结果
    cout<<ans;
    return 0;
}

代码执行流程

  1. 输入处理: 读取最高进制N、两个数的位数ma和mb,然后按位逆序读取A和B的每一位数字。

  2. 计算每位的最小可能进制: 对于A和B的每一位,计算其最小可能的进制,即该位上数字+1,但不小于2,并存储在数组s中。

  3. 减法操作: 以逆序遍历的方式进行逐位减法操作。注意处理借位和进制转换逻辑,并且用vector存储计算结果。

  4. 结果转换和输出: 将存储在vector中的减法结果转换为十进制数,并在每步操作中取模1000000007,最后输出这个结果。

代码的关键在于理解X进制的特殊性,以及如何在不同进制之间进行转换和计算,同时还要考虑大数的模运算处理。


这里我犯了一个不该犯的错误,导致我被卡了很久,最后是一位学弟帮我看出来的

base=(base*s[i])%mod;

在求base时我错误的写成了

base*=s[i]%mod

这等同于

base=base*(s[i]%mod)

这会导致s[i]>mod时丢失s[i]的值,从而得不到base的正确值


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建Qt Quick Projects

在创建Qt Quick项目之前&#xff0c;我们简单说一下Qml和Qt Quick的关系&#xff1a;它们的关系类似于C和STL标准库的关系&#xff0c;Qml类比C语言&#xff0c;提供了基本语言特性和类型&#xff1b;而Qt Quick则类比STL标准库&#xff0c;Qt Quick在QML的基础上加入了一系列界…

Https【Linux网络编程】

目录 一、为什么需要https 二、常见加密方法 1、对称加密 2、非对称加密 3、数据指纹 三、选择什么加密方案&#xff1f; 方案一&#xff1a;对称加密&#xff08;&#xff09; 方案二&#xff1a;双方使用非对称加密&#xff08;效率低&#xff09; 方案三&#xff1a…

深度学习十大算法之Diffusion扩散模型

1. 引言 扩散模型在近年来成为了热门话题&#xff0c;其火速蹿红主要归功于在图像生成领域的突破应用。尤其是一些从文本到图像的生成技术&#xff0c;它们成功地运用了扩散模型来创建令人惊叹的逼真图像。如果你听说过某个应用能够迅速且高质量地生成图像&#xff0c;那么很可…

【SpringBoot整合系列】SpirngBoot整合EasyExcel

目录 背景需求发展 EasyExcel官网介绍优势常用注解 SpringBoot整合EaxyExcel1.引入依赖2.实体类定义实体类代码示例注解解释 3.自定义转换器转换器代码示例涉及的枚举类型 4.Excel工具类5.简单导出接口SQL 6.简单导入接口SQL 7.复杂的导出&#xff08;合并行、合并列&#xff0…

docker 共享网络的方式实现容器互联

docker 共享网络的方式实现容器互联 本文以nacos连接mysql为例 前提已经在mysql容器中初始化好nacos数据库&#xff0c;库名nacos 创建一个共享网络 docker network create --driver bridge \ --subnt 192.168.0.0/24 \ --gateway 192.168.0.1 mynet此处可以不指定网络模式、…

Python下载bing每日壁纸并实现win11 壁纸自动切换

前言: 爬虫哪家强,当然是python 我是属于啥语言都用,都懂点,不精通,实际工作中能能够顶上就可以。去年写的抓取bing每日的壁纸&#xff0c;保存到本地&#xff0c;并上传到阿里云oss&#xff0c;如果只是本地壁纸切换&#xff0c;存下来就行&#xff0c;一直想做个壁纸站点&…

Java代码基础算法练习-自定义函数之字符串连接-2024.03.30

任务描述&#xff1a; 写一函数&#xff0c;将两个字符串连接起来&#xff0c;然后在主函数中调用该函数实现字符串连接操作。 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.Scanner;public class m240330 {public static void main(Stri…

【Java】MyBatis快速入门及详解

文章目录 1. MyBatis概述2. MyBatis快速入门2.1 创建项目2.2 添加依赖2.3 数据准备2.4 编写代码2.4.1 编写核心配置文件2.4.2 编写SQL映射文件2.4.3 编写Java代码 3. Mapper代理开发4. MyBatis核心配置文件5. 案例练习5.1 数据准备5.2 查询数据5.2.1 查询所有数据5.2.2 查询单条…

全国青少年软件编程(Python)等级考试三级考试真题2023年12月——持续更新.....

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;三级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 一、单选题(共25题&#xff0c;共50分) 1.一个非零的二进制正整数&#xff0c;在其末尾添加两个“0”&#xff0c;则该新数将是原数的&#xf…

Redis从入门到精通(二)Redis的数据类型和常见命令介绍

文章目录 前言第2章 Redis数据类型和常见命令2.1 key结构2.2 Redis通用命令2.3 String类型及其常用命令2.4 Hash类型及其常用命令2.5 List类型2.5 Set类型2.6 SortedSet类型2.7 小结 前言 在上一节【Redis从入门到精通(一)Redis安装与启动、Redis客户端的使用】中&#xff0c;…

【智能算法】猎人猎物算法(HPO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;Naruei等人受到自然界动物猎食过程启发&#xff0c;提出了猎人猎物算法&#xff08;Hunter-Prey Optimization&#xff0c; HPO&#xff09;。 2.算法原理 2.1算法思想 HPO模拟…

国产AI大模型推荐(一)

文心一言 主要功能&#xff1a; 各种类型的问答、各种文本创作、推理与数学计算、写代码、聊天交流、图片生成等。 链接&#xff1a;文心一言 讯飞星火 特点&#xff1a; 内容生成能力&#xff1a;我可以进行多风格多任务长文本生成&#xff0c;例如邮件、文案、公文、作文、对…

剑指Offer题目笔记23(归并排序)

面试题77&#xff1a; 问题&#xff1a; ​ 输入一个链表的头节点&#xff0c;将该链表排序。 解决方案&#xff1a; ​ 使用归并排序。将链表分为两个子链表&#xff0c;在对两个子链表排序后再将它们合并为一个排序的链表。 源代码&#xff1a; /*** Definition for sin…

C语言:动态内存管理(二)

目录 前言 1.3 realloc​编辑 3、常见动态内存管理错误 3.1 对空指针的解引用操作 3.2 对动态开辟的空间进行越界访问 3.3 对非动态开辟内存使用free释放 3.4 使用free释放一块动态内存开辟的一部分 3.5 对同一块空间的多次释放 3.6 动态内存开辟之后忘记释放 总结 前…

前端三剑客 —— HTML (下)

目录 HTML 多媒体标签 Img*** a标签*** 第一种用法&#xff1a;超链接 第二种用法&#xff1a;锚点 audio标签 video标签 表格标签 带标题的表格 跨行跨列标签 表格嵌套 列表标签 ul --- 它是无序列表标签 ol --- 它是有序列表 dl --- 它是数据列表 表单标签***…

2024.3.30学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p295-p314 super关键字 super代表父类的引用&#xff0c;用于访问父类的属性、方法、构造器 super细节和语法 访问父类的属性&#xff0c;但不能访问父类的private属性 super.属性名 访问父类的…

暴力破解pdf文档密码

首先安装pdfcrack工具包 apt install pdfcrack 默认密码字典存储在/usr/share/wordlists里&#xff0c;是gz文件&#xff0c;将它解压并copy到pdf目录 然后使用pdfcrack破解 密码在最后一行user-password的单引号里

最优算法100例之17- 环形连续子数组的最大和

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 给定一个长度为 nn 的环形整数数组,请你求出该数组的 非空 连续子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开…

Linux重点思考(下)--shell脚本使用以及内核开发

Linux重点思考(下&#xff09;--shell脚本使用和组合拳 shell脚本的基础算法shell脚本写123...n的值&#xff0c;说思路Shell 脚本用于执行服务器性能测试的死循环Shell 脚本备份和定时清理垃圾文件 shell脚本的内核开发正向映射反向映射 shell脚本的基础算法 shell脚本写123……

解决MySQL幻读?可重复读隔离级别背后的工作原理

什么是当前读和快照读 当前读&#xff1a;又称为 "锁定读"&#xff0c;它会读取记录的最新版本&#xff08;也就是最新的提交结果&#xff09;&#xff0c;并对读取到的数据加锁&#xff0c;其它事务不能修改这些数据&#xff0c;直到当前事务提交或回滚。"sele…