NC238581. Pair
描述
输入描述
第一行输入正整数,接下来一行个整数表示。
输出描述
一行一个数字表示答案。
示例1
输入:
8 12 7 11 6 5 0 2 8
输出:
6
示例2
输入:
6 3 7 2 6 1 1
输出:
3
说明:
是满足条件的三对(这里放的是的值而非下标)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)