1 2 3 4

异或和之和

https://ac.nowcoder.com/acm/contest/5600/J

 

 

 

 

#include<iostream>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const int maxn = 2e5+111;
int n;
ll k_q(ll a,ll b){
	ll res = 1;
	while(b){
		if(b&1){
			res = (res*a)%mod;
		}
		b>>=1;
		a = (a*a)%mod;
	}
	return res%mod;
}

ll jc[maxn];
ll list[maxn];//list[i]是i的阶乘
 
ll C(ll n,ll m){

	ll ans = (list[n]*((jc[m]*jc[n - m])%mod))%mod;
	
	return ans%mod;
}

ll cnt1[2000];//1
ll cnt0[2000];

int main(){
	scanf("%d",&n);
	list[0] = 1;
	
	for(int i=1;i<maxn;i++){
		list[i] = (1LL*list[i-1] * i)%mod;
	}
	for(int i=0;i<maxn;i++){
		jc[i] = k_q(list[i],mod-2)%mod;
	}
	
	int cns=0;
	for(int i=0;i<n;i++){
		ll x;
		scanf("%lld",&x);
		for(ll j=0;j<60;j++){
			int t = (x>>j)&1;
			if(t) cnt1[j]++;
			else cnt0[j]++;
		}
	}
	ll sum = 0;
	ll ans = 0;
	for(int i=0;i<60;i++){
		if(cnt1[i] == 0) continue;
	
		if(cnt1[i]>=3){
			ans = (C(cnt1[i],3)*k_q(2,i))%mod;
			
			sum = (sum + ans)%mod;
			
		}
		if(cnt0[i] >= 2){
			
			ans = (C(cnt0[i],2)*cnt1[i])%mod;
			
			ans = (ans*k_q(2,i))%mod;
			
			sum = (sum + ans)%mod;
			
		}
	}
	cout<<sum<<endl;
	return 0;
} 

  

posted @ 2020-05-20 18:19  Lesning  阅读(687)  评论(0编辑  收藏  举报