题目描述 Description

有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥。

输入描述 Input Description

输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9)。接下来一行包含N个不同正整数ai(1<=ai<=10^9)。

输出描述 Output Description

输出一行表示最大的满足要求的子集的元素个数。

样例输入 Sample Input

4 2

1 2 3 4

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

分析:

我们先通过特殊情况找找规律,如P=2时候(我们假设初始集合足够大)

2->2*2->2*2*2->2*2*2*2->……

3->3*2->3*2*2->3*2*2*2->……

5->5*2->5*2*2->5*2*2*2->……

……

从上面的我们可以看出a*p^(b-1)影响a*p^b(如果存在),而a*p^b影响a*p^(b+1)……,我们假设这样的序列叫做“影响序列”

————————————————————————————————————————————————————

特别注意:

①影响序列中P的次数是连续的

如原数组是6 12 24 96,p=2

则原数组有2个影响序列:(6,12,24)和(96),因为中间缺少了48所以第一个影响序列与第二个影响序列不能合并

②影响序列是完整的

如6 12 24 96,p=2

不能说原数组有3个影响序列(6,12)(24)(96)或(6)(12,24)(96),因为前面两个影响序列可以合并成一个更完整的

——————————————————————————————————————————————————————————

易得出关于 影响序列 的一些性质:

① 任何一个数组都可以分成若干个 影响序列(特别的影响序列只有一个元素)且不同的影响序列互不影响,即一个影响序列中元素的取舍与另个影响序列元素取舍中互不影响(类比将置换群分成若干个轮换)

② 一个影响序列中的元素对应的P对应的次方是严格递增且连续的,如p=2,底数a=3时,6,12,24是一个影响序列,他们是3*2^1,3*2^2,3*2^3,P上面的次数是1,2,3是连续且严格递增的

③ 由②易得如果一个影响序列在中间的某处断掉了,相当于将这个影响序列变成左右两边两个独立的影响序列,两者互不影响

接下来分析题目:

由性质①我们可以将原数组化成若干个影响序列单独处理(化归思想),于是下面我们考虑如何才处理单独的一个影响序列

让我们来明确一下我们想把一个影响序列处理成什么样子:由题意我们应该是要将这个影响序列中删除最少的数使得这个影响序列中剩余的数互不影响,而由性质①和③我们可以知道不同的影响序列互补影响,且删除一个数相当于把影响序列分裂成两个!!!!,即我们的目标是这个影响序列分裂成尽可能多的单元素影响序列!!!

我们发现我们无论采取怎样的分裂方案,始终是一种分治的思想,到最后,把一个影响序列分成若干个两元素影响序列,然后删除每个其中的一个数就完成了,从宏观来看,也就是说我们对于元素个数为n的影响序列我们采取n/2(向下取整)次删除,也就是删了这么多数。于是我们有一个很重要结论——————————————  一个n元素影响序列,我们应最少删除n/2(向下取整)个数

好了现在题目就明朗了,我们只要找出对应的每个影响序列就行了,鉴于题目的数据范围很大,我们可以用散列表来表示数组中的每个数,然后对于读入的一个数x,将x加入到x*p的集合中,并给对应的集合个数+1(类似于并查集)

或者还有一种做法就是二分:

先把读入的数组ai排序 计数器初值为n

然后从第一个往后扫,发现ai*p也在集合(二分查找)中就删掉它(打个标记),计数器减一

最后输出~~

在纸上划一划就发现这样的实质也就是将影响序列中连续2个元素中删掉一个,所以是对的。

[wikioi1553]互斥的数(数学分析+散列/数学分析+二分)的更多相关文章

  1. 数据结构---哈希表的C语言实现(闭散列)

    原文地址:https://blog.csdn.net/weixin_40331034/article/details/79461705 构造一种存储结构,通过某种函数(hashFunc)使元素的存储位 ...

  2. Redis从基础命令到实战之散列类型(Hash)

    从上一篇的实例中可以看出,用字符串类型存储对象有一些不足,在存储/读取时需要进行序列化/反序列化,即时只想修改一项内容,如价格,也必须修改整个键值.不仅增大开发的复杂度,也增加了不必要的性能开销. 一 ...

  3. 线性探测再散列 建立HASH表

    根据数据元素的关键字和哈希函数建立哈希表并初始化哈希表,用开放定址法处理冲突,按屏幕输出的功能表选择所需的功能实现用哈希表对数据元素的插入,显示,查找,删除. 初始化哈希表时把elem[MAXSIZE ...

  4. java加密算法--MD5加密和哈希散列带秘钥加密算法源码

    package com.ompa.common.utils; import java.security.MessageDigest; import java.security.NoSuchAlgori ...

  5. s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译

    时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...

  6. PTA 逆散列问题 (30 分)(贪心)

    题目链接:https://pintia.cn/problem-sets/1107178288721649664/problems/1107178432099737614 题目大意: 给定长度为 N 的 ...

  7. python对redis的常用操作 上 (对列表、字符串、散列结构操作)

    这里的一切讨论均基于python的redis-py库. 安装使用: pip install redis 然后去获取一个redis客户端: redis_conn = redis.Redis(host=R ...

  8. [No0000132]正确使用密码加盐散列[译]

    如果你是一个 web 开发工程师,可能你已经建立了一个用户账户系统.一个用户账户系统最重要的部分是如何保护密码.用户账户数据库经常被黑,如果你的网站曾经被攻击过,你绝对必须做点什么来保护你的用户的密码 ...

  9. 【Redis学习之五】Redis数据类型:列表和散列

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.列表 基于Linked Lis ...

随机推荐

  1. HTML5客户端数据存储

    HTML5 使在不影响网站性能的情况下存储大量数据成为可能.之前,这些都是由 cookie 完成的,cookie不适合大量数据的存储,因为会影响速度. 举个例子: var obj = {x:1}; / ...

  2. hdu 1003 Max sum(简单DP)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem ...

  3. Java 集合介绍

    1, Set :集合中对象不按特定的方式排序,并且没有重复对象,它有些实现类能对集合按特定方式排序 List :集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索独享,Li ...

  4. Reading WebSites

    oracle http://www.eygle.com/archives/2006/02/the_sun_repays_industriously.html 蕃茄土豆: https://pomotod ...

  5. 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)

    Bitmap 是图形类,Android 系统支持的图片格式有 png.jpg.bmp 等. 对位图操作在游戏中是很重要的知识点,比如游戏中需要两张除了大小之外其他完全相同的图,那么如果会对位图进行缩放 ...

  6. 事件查看器常见ID代码解释

    ID 类型 来   源 代 表 的 意 义 举 例 解 释 信息 Serial 在验证 \Device\Serial1 是否确实是串行口时,系统检测到先进先出方式(fifo).将使用该方式. 错误 W ...

  7. 在spring环境下集成ActiveMQ

    1.参考文献 Spring集成ActiveMQ配置 Spring JMS异步发收消息 ActiveMQ 2.环境 在前面的一篇ActiveMQ入门实例中我们实现了消息的异步传送,这篇博文将如何在spr ...

  8. 委托--delegate

    委托,跟类很相似,能够定义对象,但是区别是 1,委托必须有关键字delegate. 2,委托有类型修饰符,比如void,string,int.修饰符取决于他的方法返回类型. 3,委托没有方法实现. d ...

  9. vuejs过滤器

    结合管道符 | {{messageOne | capitalize}} capitalize 首字母大写 {{messageOne | uppercase}} uppercase 大写字母 {{mes ...

  10. 022医疗项目-模块二:药品目录的导入导出-对XSSF导出excel类进行封装

    资源全部来源于传智播客. 好的架构师写的程序,就算给刚入门的新手看,新手一看就知道怎么去用.所以我们要对XSSF导出excel类进行封装.这是架构师的工作,但我们也要知道. 我们写一个封装类: 这个类 ...