1 条题解

  • 1
    @ 2022-08-18 18:45:06
    #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

信息

ID
1546
难度
4
分类
模拟 点击显示
标签
递交数
1
已通过
1
通过率
100%
上传者