「Codeforces」D. Infinite Set
D. Infinite Set
https://codeforces.com/contest/1635/problem/D
题目描述
你有一个由不同正整数组成的数组和一个无限集 S,现在你需要往集合 S 中塞入所有符合 x x x 条件的数。
x x x 的条件(满足其中任意一个即可):
- x = a i ( 1 ≤ i ≤ n ) x = a_i(1\leq i\leq n) x=ai(1≤i≤n)
- x = 2 y + 1 ( y ∈ S ) x = 2y + 1 (y \in S) x=2y+1(y∈S) ( y y y 必须在 S 集合中)
- x = 4 y ( y ∈ S ) x = 4y (y \in S) x=4y(y∈S) ($y $ 必须在 S 集合中)
求无限集 S 中所有小于 2 p 2^p 2p 的个数。
输入描述
第一行包含两个整数 n 和 p (1≤n,p≤2⋅105)。
第二行包含 n 个整数 a1,a2,…,an (1≤ai≤109)。
保证 a 中的所有数字都是不同的。
输出描述
打印一个整数,即 S 中严格小于 2p 的元素数。 请记住以 109+7 为模打印。
样例
#1
2 4
6 1
9
#2
4 7
20 39 5 200
14
#3
2 200000
48763 1000000000
448201910
提示
在第一个示例中,小于 24 的元素是 {1,3,4,6,7,9,12,13,15}。
在第二个例子中,小于 27 的元素是 {5,11,20,23,39,41,44,47,79,80,83,89,92,95}。
解析
有一说一,二进制的题目我确实没写过…,一时间也只能想到暴力,可这样不可能过,后面看大佬题解,发现要用二进制…
**Tips:**以后但凡看到这种 2 p 2^p 2p 次幂的形式,要往二进制想想。
根据二进制, x x x 的第二和第三条件可以转为:
- 第一条件其实就是 A 数组的所有元素均属于 S
- 2 x + 1 2x+1 2x+1 相当于 2 < < 1 2 << 1 2<<1 然后加 1 1 1 (向后添加一个 1)
- 4 x 4x 4x 相当于 4 < < 2 4 << 2 4<<2 (向后添加两个 0)
题目要我们求 S 中所有小于 2 p 2^p 2p 的数,其实就是求对应的二进制最高位 1 的后面 0 的变化,例如 p = 3 p=3 p=3 时,对应二进制为 1000 1000 1000 ,我们可以得到且不保证符合的有 0000 、 0100 、 0110 、 0111 、 0010 、 0011 、 0001 0000、0100、0110、0111、0010、0011、0001 0000、0100、0110、0111、0010、0011、0001 。
通过上面的例子,我们发现,只是 1 后面的 0 发生了变化,而我们的规则是要么增加一个 1,要么增加两个0(这0是一起添加的,不能分开)。
我们假设一个数为 x x x ,那么我们可以得到:
x x x 增加位数 | 得到的不同的数 | |
---|---|---|
0 | x x x | 1 |
1 | x 1 x1 x1 | 1 |
2 | x 00 、 x 11 x00、x11 x00、x11 | 2 |
3 | x 001 、 x 100 、 x 111 x001、x100、x111 x001、x100、x111 | 3 |
4 | x 0000 、 x 1100 、 x 0011 、 x 1111 、 x 1001 x0000、x1100、x0011、x1111、x1001 x0000、x1100、x0011、x1111、x1001 | 5 |
上表意思:一个数的二进制在其后面增加若干位数,每次只能增加一个 1 或两个 0 ,那么最终得到的不同的数有多少个。
并且能发现,无论如何变化,它们都保证是唯一的。
看得出来这是个斐波那契数列 F [ i ] = F [ i − 1 ] + F [ i − 2 ] F[i] = F[i-1] + F[i-2] F[i]=F[i−1]+F[i−2] ,这里表示一个数增加 i i i 位可以得到的不同数的数量为 F [ i ] F[i] F[i] 个。
我们现在只是求了一个数增加若干位若得到的不同数,并没有将前面的也算进来,所以还需要对其做一个前缀和 p r e f i x [ i ] = p r e f i x [ i − 1 ] + F [ i ] prefix[i] = prefix[i-1] + F[i] prefix[i]=prefix[i−1]+F[i] ,此时定义变为 p r e f i x [ i ] prefix[i] prefix[i] 表示增加 i i i 位后所得到的所有不同数。
最后需要注意若一个数 a i a_i ai 可以由另外一个数得到 a j a_j aj ,因此为了不重复计算,所以只保留 a i a_i ai ,例如 A 有 2, 8 两个元素,8 可以通过 2 得到,因此我们只保留 2 即可。
2:0010
8:1000
0010 可以通过一次变化(即在尾部加两个 0 )==> 001000 ==> 1000
AC Code
public class Main {static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));public static void main(String[] args) throws Exception {final int MOD = 1000000000 + 7;final int MAX = 200005;int n = nextInt(), p = nextInt(), ans = 0;int[] A = new int[MAX];int[] F = new int[MAX];int[] prefix = new int[MAX];F[0] = F[1] = 1;prefix[0] = 1; prefix[1] = 2;HashMap<Integer, Boolean> map = new HashMap<>();for(int i = 2; i < MAX; i++) {F[i] = (F[i-1] + F[i-2]) % MOD;prefix[i] = (prefix[i-1] + F[i]) % MOD;}for(int i = 1; i <= n; i++) {A[i] = nextInt();map.put(A[i], true);}// 对数组元素进行去重for(int i = 1; i <= n; i++) {int x = A[i];while(x != 0) {if(x % 2 == 1) x >>= 1; // 条件2,末尾加 1else if(x % 4 == 0) x >>= 2; // 条件3,末尾加两个 0else break;if(map.containsKey(x)) { // 判断 x 是否已经存在 S 中map.remove(A[i]); // 若存在,则表示 A[i] 可以通过其它元素得到,估抛弃该元素break;}}}Set<Integer> set = map.keySet();for(Integer x : set) {int bit = 32 - Integer.numberOfLeadingZeros(x); // 获取 x 二进制位数的前导零个数if(bit > p) continue;ans += prefix[p - bit];ans %= MOD;}System.out.println(ans);}public static int nextInt() throws Exception {st.nextToken();return (int) st.nval;}
}
相关文章:
「Codeforces」D. Infinite Set
D. Infinite Set https://codeforces.com/contest/1635/problem/D 题目描述 你有一个由不同正整数组成的数组和一个无限集 S,现在你需要往集合 S 中塞入所有符合 x x x 条件的数。 x x x 的条件(满足其中任意一个即可): x a i …...

项目---基于TCP的高并发聊天系统
目录 服务端 服务端视角下的流程图 一、数据库管理模块 1.1 数据库表的创建 1.2 .对于数据库的操作 1.2.1首先得连接数据库 1.2.2执行数据库语句 1.2.3 返回数据库中存放的所有用户的信息 1.2.4返回数据库中存放的所有用户的好友信息 二、用户管理模块 2.1、UserInfo类&…...
iOS热更新-8种实现方式
一、JSPatch 热更新时,从服务器拉去js脚本。理论上可以修改和新建所有的模块,但是不建议这样做。 建议 用来做紧急的小需求和 修复严重的线上bug。 二、lua脚本 比如: wax。热更新时,从服务器拉去lua脚本。游戏开发经常用到。…...

R语言 | 编写自己的函数
目录 一、正式编写程序 二、设计第一个函数 三、函数也是一个对象 四、程序代码的简化 五、return()函数的功能 六、省略函数的大括号 七、传递多个参数函数的应用 7.1 设计可传递2个参数的函数 7.2 函数参数的默认值 7.3 3点参数“…”的使用 八、函数也可以作为参数 …...

【Java校招面试】基础知识(七)——数据库
目录 前言一、数据库索引二、数据库锁三、数据库事务四、数据库连接池后记 前言 本篇主要介绍数据库的相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第六篇博文,如有需要,可: 点击这里,返回本专栏的索引文…...

MySQL高级--锁
一、锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题…...

Maven(六):Maven的使用——继承与聚合
Maven(六):Maven的使用——继承与聚合 前言一、实验九:继承1、概念2、作用3、举例4、操作4.1 创建父工程4.2 创建模块工程4.3 查看被添加新内容的父工程 pom.xml4.4 解读子工程的pom.xml4.5 在父工程中配置依赖的统一管理4.6 子工…...

Java ---System类
System 类位于 java.lang 包,代表当前 Java 程序的运行平台,系统级的很多属性和控制方法都放置在该类的内部。由于该类的构造方法是 private 的,所以无法创建该类的对象,也就是无法实例化该类。 System 类提供了一些类变量和类方…...
代码随想录_贪心_leetcode 406 452
leetcode 406. 根据身高重建队列 406. 根据身高重建队列 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高…...
C++类的静态成员详解:成员函数非静态成员函数的非法调用
在C中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。 静态成员的定义或声明要…...

Qt之滑动条和进度条(QSlider、QProgressBar)
文章目录 前言一、QSliderQSlider的常用API信号与槽 二、QProgressBar滑动条和滚动条的常用API 总结 前言 在用户界面设计中,滑动条和进度条是常见的控件。Qt中提供了QProgressBar和QSlider两个类来实现滚动条和滑动条。 一、QSlider 在Qt中,QSlider是…...

Flutter之插件开发plugin
目的:适用于独立业务模块,或者与原生页面交互频繁的地方。 基于flutter3.x , IDE :androidStudio demo:https://download.csdn.net/download/SHTLoveXX/87751845 步骤: 1.新建flutter project 【New flutter project】. 2. 在新建工程面板记得切换 …...

asp.net基于web的音乐管理网站dzkf17A9程序
本系统主要包含了等系统用户管理、公告信息管理、音乐资讯管理、音乐类型管理多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块:管理员登录系统对本系统其他管理模块进行管理。 用户的登录模块:用户登录本系统,对个…...

itop-3568开发板驱动学习笔记(25)设备树(四)GPIO 实例分析
《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 GPIO 控制器必要属性其他属性 指定 GPIO 引脚 和时钟类似,GPIO 在设备树中也存在两层定义,首先是 GPIO 控制器,这部分由芯片原厂工程师编写,相当于 GPIO 底层…...
函数(定义、返回值、调用、参数)
目录 ❤ 无参函数 ❤ 有参函数 ❤ 空函数 ❤ 什么是返回值? ❤ 为什么要有返回值? ❤ 什么是函数调用? ❤ 为何用调用函数? ❤ 函数调用的三种形式 ❤ 形参和实参 形参 实参 ❤ 位置参数 位置形参 位置实…...
28. Kubernetes 核心组件讲解——API Server
本章讲解知识点 Kubernetes API Server 概述etcd 简介API Server 架构解析API Server 的 List-Watch 机制独特的 Kubernetes Proxy API 接口集群功能模板之间的通信1. Kubernetes API Server 概述 1.1 基本概念 Kubernetes API Server(API Server)是 Kubernetes 的核心组件…...

springboot框架开发医院云HIS 住院医生站、住院护士站功能实现
住院医生站主模块:包括医嘱管理、病案首页、分配入科、住院清单、我的质控等子模块 (1)医嘱管理功能简介 ①住院患者开立医嘱、支持医嘱复制、停止、作废等操作; ②医嘱类型含药品、项目、材料、嘱托; ③支持住院各…...
高性能定时器介绍及代码逐行解析--时间堆
简介 在《Linux高性能服务器编程》中,介绍了三种定时方法: socket选项SO_RCVTIMEO和SO_SNDTIMEOSIGALRM信号I/O复用系统调用的超时参数 基础知识 非活跃,是指客户端(这里是浏览器)与服务器端建立连接后,…...
汇编语言学习笔记五
div指令 除法, 被除数:默认是放在ax或者dx中,其位数为16位,则在ax中,如位数为32位,则高位在dx中,低位在ax中 除数:放在寄存器或者内存单元中,有8位和16位两种。 结果&am…...
Linux下的epf 是什么?
EPF (Extended Page Frame) 是 Linux 内核中的一个功能,它用于管理大内存系统中的物理页框。具体来说,当系统中的物理内存超过 1TB 时,传统的页表结构会变得非常庞大和复杂,给内存管理带来很大的困难。 EPF 架构通过将物理地址分…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...