CF1759F题解

Brief Description

给你一个 \(n\) 位的 \(p\) 进制数,第 \(i\) 位为 \(a_i\)

请问最少要让该数加多少次 \(1\),可以让数码 \(0,\cdots,p−1\) 都出现过(包含在中间过程出现)。

Solution

因为是 \(p\) 进制,不难发现答案一定不会超过 \(p−1\),也就是说在最坏情况下就是其最后一位加至多 \(p−1\) 次才可以使得 \(0, \cdots ,p-1\) 每一个数码都出现一次。

然而题目给的数有 \(n\) 位,是有一定量的数码是出现过的。
所以显然可以考虑分进位不进位分类讨论。

进位的条件其实就是存在小于它的数它没有出现过

这样讨论完了之后假设第一位为 \(x\) 那么小于等于 \(x\) 的都出现过,那么我们只需要找到一个最大的没有出现过的数让 \(x\) 加到这个数就好了。

Code

#include<bits/stdc++.h>                              
using namespace std;              
const int N = 5e6+5;           
int a[N];           
map<int,bool> vis;        
int main(){          int t;             scanf("%d",&t);          while(t--){        int n,p;	                  		scanf("%d%d",&n,&p);	                   for(int i=1; i<=n; i++)	scanf("%d",&a[i]);                for(int i=1; i<=n; i++)	vis[a[i]] = true;                reverse(a+1,a+n+1);                    bool flag = true;                         for(int i=a[1]; i>=max(a[1]-300,0); i--)              if(!vis[i])                                  flag = false;     set<int> st;          int ans = 0;          int limit = p - 1;            if(!flag){                       ans += p - 1 - a[1] + 1;       limit = a[1] - 1;a[1] = 0;     a[2]++;                   for(int i=2; i<=n; i++){                 if(a[i] == p)	a[i] = 0,a[i+1]++;     }  }                                           for(int i=1; i<=n; i++)	vis[a[i]] = true;            if(a[n+1])	vis[a[n+1]] = true;              for(int i=limit; i>=max(limit-300,0); i--){          if(!vis[i]){             ans = ans + i - a[1];          break;    }       }                                        printf("%d\n",ans);vis.clear();         for(int i=1; i<=n+1; i++)	a[i] = 0; }                             return 0;              
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

招行面试:亿级秒杀,超卖问题+少卖问题,如何解决?(图解+秒懂+史上最全)

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

OpenCL入门笔记

1、概述 1.1、OpenCL标准 OpenCL(Open Computing Language)是一个开放标准的并行编程框架,它允许开发者在异构系统上利用各种计算设备(例如CPU、GPU、FPGA等)来加速任务,目前已被广泛应用于视频处理、医学成像、机器学习等领域。 OpenCL最初由苹果公司提出,并在与AMD、IBM…

京东自动化上传图片

背景:客户目前每天需花费2小时在京东平台上传商品图片,该过程涉及手动输入SkuId并上传相应图片。由于商品数量庞大,这一操作不仅繁琐,而且容易导致错误匹配的情况。期望:通过引入自动化工具实现京东商品图片更新的自动化处理,提高操作准确性,预计每日为客户节省2小时的人…

46. bootstrap

1. bootstrap介绍中文网:https://bootcss.com/bootstrap需要导入两个文件:上方文件夹里的css文件和JavaScript文件 由于bootstrap v3依赖jQuery,因此还要导入jQuery文件bootstrap的核心是通过class直接使用类 2. 全局css样式 Bootstrap 将设置全局的 CSS 样式。HTML 的基本元…

虽然你已经更新了,但是pip依然提示[notice] A new release of pip is available

虽然你已经更新了pip的版本,但是pip依然提示[notice] A new release of pip is available,而且导致安装的时候出错。其实是在 pip 对应的文件夹中有多个.dist-info文件。 参照你的python位置,如:"..\PythonXX\Lib\site-packages\pip-{老版本}.dist-info"留一个就…

02 Java基础

注释 定义:写代码时,随着项目变复杂要用到注释,注释是给写代码的人看的,且写注释是好习惯。 类型:单行注释 // 多行注释 /* 注释 */ 文档注释 /**注释 */标识符 关键字:Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符 标识符注意点:…

五子棋软件Gomoku

大家好!Gomoku是我用VB6开发的五子棋软件,适合于打谱,棋盘截图等。(不支持人机对弈)每走一步棋,右侧的列表框显示相应的坐标,鼠标点击右侧列表可以悔棋。

循环语句小结

三种循环语句特点及比较一、for循环语句 for语句最常用的格式为: for (循环变量赋初值;循环条件;循环变量增值) 语句; 注: “语句;”就是循环体,可以是一个简单的语句,也可以是一个用“{}”括起来的复合语句。 它的执行过程如图示:for语句要素与流程环节对应图:二、w…

【建议收藏】工程师必须要知道的20个PCB设计规则

今天给大家分享:工程师必须知道的 12 个PCB设计原则 1、控制走线长度 控制走线的长度,顾名思义,就是短走线的规则,PCB 设计时应控制走线长度尽可能短,以免因走线过长而引入不必要的干扰。 特别是对于一些重要的信号线,例如时钟信号走线,一定要将其振荡器放置得离器件非常…

创建maven多模块项目

创建Maven父模块创建项目项目目录结构、pom.xml文件在pom.xml文件中配置打包类型为pom创建子模块common选中项目,鼠标右键,依次选择 “New→Module”项目pom.xml文件,可以看到parent标签里的内容,表示父模块的信息。在pom.xml文件中配置打包类型为jar(非必须,可加可不加)…

《操作系统真相还原》实验记录2.4——内存管理系统

本文章实现内容如下: 1. 位图的建立; 2. 内存池初始化; 3. 分配内存初试;一、位图 bitmap 及其函数的实现 1.1 位图简介位图,也就是bitmap,广泛用于资源管理,是一种管理资源的方式、手段。“资源”包括很多,比如内存或硬盘,对于此类大容量资源的管理一般都会采用位图…

信息安全数学基础-期末(第八章)

群 定义 半群的定义:设S是一个具有结合法的非空集合.如果S中有一个元素e;使得对S中所有元素a,都有 ea=ae=a. 单位元的定义: 性质:设 S是一个有单位元的半群, 则对 S 中的任意可逆元 a, 其逆元 a 是唯的 群的定义: 子群 定义: 同态和同构 定义: 单射、满射、双射: 单射确…