列表

详情


NC238581. Pair

描述

给定n个整数,第i个为a_i,请你统计有多少对无序对(i,j),满足
其中代表二进制按位与,代表二进制按位异或。
无序对的意思是(i,j)(j,i)被视为同一对。

输入描述

第一行输入正整数n,接下来一行n个整数表示a_i

输出描述

一行一个数字表示答案。

示例1

输入:

8
12 7 11 6 5 0 2 8

输出:

6

示例2

输入:

6
3 7 2 6 1 1

输出:

3

说明:

(1,1),(3,2),(6,7)是满足条件的三对(这里放的是a_i的值而非下标)

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 446ms, 内存消耗: 39216K, 提交时间: 2022-07-15 19:27:04

import sys
from collections import deque
input = lambda: sys.stdin.readline().rstrip("\r\n")
n=int(input())
l=map(int,input().split())
ll=[0 for i in range(128)]
sum=0
k=1
for i in l:
    if i==0:
        pass
    else:
        ll[len(bin(i)[2:])]+=1
for i in ll:
    if i>=2:
        sum+=i*(i-1)//2
print(sum)

C++(g++ 7.5.0) 解法, 执行用时: 40ms, 内存消耗: 424K, 提交时间: 2022-08-07 20:34:08

#include<cstdio>
#define ll long long
using namespace std;
ll n,a,f[32],ans;
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a);
		for(int j=31;j>=0;j--)
		if((a>>j)&1){f[j]++;break;}
	}
	for(int i=0;i<32;i++) ans=ans+(f[i]-1)*f[i]/2;
	printf("%lld",ans);
	return 0;
}

C++ 解法, 执行用时: 47ms, 内存消耗: 1192K, 提交时间: 2022-07-18 10:46:51

#include <cstdio>

int n,a[1000001];
int bit[41];
long long ans;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",a+i);
		if(!a[i])continue;
		int L=0;
		while(a[i])++L,(a[i]>>=1);
		ans+=(bit[L]++);
	}
	printf("%lld\n",ans);
}

Python3 解法, 执行用时: 155ms, 内存消耗: 23216K, 提交时间: 2022-07-29 23:07:39

input()
arr = [0 for i in range(33)]
for x in map(int,input().split()):
    if x:
        arr[len(bin(x))]+=1
 
ans = 0
for i in range(33):
    ans += arr[i]*(arr[i]-1)
print(ans//2)

上一题