1 条题解
-
0Guest LV 0 MOD
-
1
#include<bits/stdc++.h> using namespace std; int a[100005],k[35]; int s(int a)//按题目要求做 (就是求这个数化为 2 进制后 1 的个数 ) { int sum=0; while(a)//每次后面有操作(/2),只要 a 不为 0 { if(a%2==1) sum++; a/=2; } return sum;//这个二进制数中 1 的个数 } int main() { freopen("pairs.in","r",stdin); freopen("pairs.out","w",stdout); int t,n; cin>>t; while(t--) { long long ans=0; scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d",&a[i]); k[s(a[i])]++;//k 数组用来记录有 i (下标) 个 1 的十进制数个数 } for(int i=1; i<=35; i++) ans+=1ll*k[i]*(k[i]-1)/2;//组合数C(x,2) printf("%lld\n",ans); memset(k,0,sizeof(k)); } return 0; }
- 1