异或和之和
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;
}
寻找真正的热爱

浙公网安备 33010602011771号