T422522 k耦合
题目描述
若两个数$x,y$,他们在二进制形式下有$k$位是不同的,我们称这两个数字是$k$耦合的。
例如二进制$1001$和$0110$是满足$4$耦合的,他们有$4$位不同
现在给出一个非负整数序列$a_1,a_2,…..,a_n$,你需要求存在多少对$(i,j),i<j$使得$a_i,a_j$是满足$k$耦合的。
输入格式
第一行输入$n,k$,表示序列长度和耦合要求
第二行输入$n$个数,表示序列$a$
输出格式
输出一个数字表示答案
样例 #1
样例输入 #1
1 |
|
样例输出 #1
1 |
|
样例 #2
样例输入 #2
1 |
|
样例输出 #2
1 |
|
提示
数据范围:
$(2 ≤ n ≤ 10^5, 0 ≤ k ≤ 14)$
$(0 ≤ a_i ≤ 10^4)$
题解
首先最先想到的是枚举$i$,$j$判断$a_i$,$a_j$是否为k耦合。时间复杂度尾或者$O(n^2)$。得到的结果是超超时。考虑优化,我们发现题目所给的值域只有$10^4$,也就是说会出现重复的数字,我们对0到10000依次枚举计算是不会超时的,所以我们需要统计重复的数字来避免重复计算,减少时间。
首先我们可以创建一大小为略大于$10^4$数组,下表表示这个数,对应的值表示出现的次数。
1 |
|
然后我们依次枚举计算是否符合条件即可。
k耦合的判断方法为$a_i$^$a_j$,因为考虑异或二进制位上相同则为0,考虑两数字异或后有二进制上有几个1即可。计算一个数的二进制上有几个一有2种办法:
法一:mod2法
1 |
|
法二:位运算法
1 |
|
下面是完整代码:
1 |
|
T422522 k耦合
https://serendipity565.github.io/posts/f90aa7c963e7/