列表

详情


NC204017. 大吉大利

描述

给定个整数,依次为
。“”是二进制的与运算符。

输入描述

第一行一个整数.
第二行个整数.

输出描述

一个整数表示上述求和式的答案.

示例1

输入:

5
1 2 3 4 5

输出:

33

原站题解

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

C(clang 3.9) 解法, 执行用时: 23ms, 内存消耗: 1104K, 提交时间: 2020-04-01 20:42:51

#include<stdio.h>
main()
{
	int n,i,j,num=0;
	scanf("%d",&n);
	long long sum=0;
	long long a[n];
	for(i=0;i<n;i++)scanf("%lld",&a[i]);
	for(j=0;j<=31;j++)
	{
		num=0;
		for(i=0;i<n;i++)
		{
			if(a[i]&(1<<j))num++;
		}
		sum+=1ll*num*num*(1<<j);
	}
	printf("%lld",sum);
}

C++11(clang++ 3.9) 解法, 执行用时: 23ms, 内存消耗: 616K, 提交时间: 2020-03-27 22:59:30

#include<bits/stdc++.h>
using namespace std;
long long a[30],x,n,z;
int main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&x);
		for(int j=0;j<30;a[j++]+=(x>>j)%2);//找出贡献数 
	}
	for(int i=0;i<30;i++){
		z+=(a[i]*a[i])<<i;
	}printf("%lld\n",z); 
}

Python3(3.5.2) 解法, 执行用时: 668ms, 内存消耗: 14348K, 提交时间: 2020-03-27 19:05:42

N = int(input())
arr = list(map(int, input().split()))
ans = 0
for i in range(0, 31):
    cnt = 0
    for e in arr:
        if e & (1 << i):
            cnt += 1
    ans += cnt * cnt * (1 << i)

print(ans)

上一题