牛客练习赛60a大吉大利,二进制+组合

大吉大利

http://www.nowcoder.com/questionTerminal/02de3728585142b0b25da375fd00cdc4

把所有的数转成二进制,然后统计每一位1的个数,然后每一位内部组合,注意组合a&b==b&a且视为2组
最后再加上每个数自己和自己组合,即累和
如1,10,11,100,101(1-5),20位累计3(C(3,2)*2*20),21位累计2(C(2,2)*2*21),22累计2(C(2,2)*2*22,这里是18
最后加上1到5的和是15,得出33
#include<bits/stdc++.h>

using namespace std;
const int N=1e5+10;
typedef long long ll;

ll fct[N];
ll a,d,n,dig[40],ans,sum;

int main(){
	ios::sync_with_stdio(false);
	cin>>n;
	fct[0]=1, fct[1]=1;
	for(int i=2;i<n;i++){
		fct[i]=fct[i-1]*i;
	}
	for(int i=0;i<n;i++){
		cin>>a;
		sum+=a;
		d=0;
		while(a){
			if(a&1) dig[d]++;
			a>>=1;
			d++;
		}	
	} 
	for(int i=0;i<32;i++){
		if(dig[i]>=2)ans+=fct[dig[i]]/fct[dig[i]-2]*(1<<i);
	}
	cout<<ans+sum<<endl;
	return 0;
}

创作不易,(你懂的)
全部评论

相关推荐

king122:专业技能不要写这么多,熟悉和熟练你经不住问,排版有些难看,中间的空隙搞小一点,项目描述的话感觉是从课程中抄下来的,改一改吧,不然烂大街了,每个项目都写一两点,用什么技术实现了什么难点,然后再写一些数字上去像时间又花了90%这样,这样面试会多一些,如果觉得自己的项目还是不够用的话,我有几个大厂最近做过的实习项目,感兴趣的话可以看我简介中的项目地址
点赞 评论 收藏
分享
买蜜雪也用卷:我觉得应该没有哪个人敢说自己熟练使用git,代码分支一复杂还是得慢慢寻思一下的,不过基本的拉代码提交代码还有分支什么的是应该会
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务