列表

详情


NC205862. 异或和之和

描述

给一个数组,数组内有 个正整数。
求这些数任取3个数异或运算后求和的值。
也就是说,取一共 个三元组,计算这些三元组内部异或,之后求和。(具体操作可以见样例描述)
由于该值可能过大,输出其对 取模的值。

输入描述

第一行一个正整数 
接下来有 个正整数 a_i

输出描述

任取三个数、三元组内部位异或后求和对取模的值。

示例1

输入:

4
3 4 5 6

输出:

10

说明:

共有4个三元组:{3,4,5}、{3,4,6}、{3,5,6}、{4,5,6}
3\ XOR\ 4\ XOR\ 5\ =\ 2\
3\ XOR\ 4\ XOR\ 6\ =\ 1\
3\ XOR\ 5\ XOR\ 6\ =\ 0\
4\ XOR\ 5\ XOR\ 6\ =\ 7\

相加为10\

原站题解

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

C++14(g++5.4) 解法, 执行用时: 139ms, 内存消耗: 484K, 提交时间: 2020-05-18 12:42:19

#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long a[70];
int main(){
	int n;
	scanf("%d",&n);
	long long t;
	for(int i=1;i<=n;++i){
		scanf("%lld",&t);
		for(int j=0;j<62;++j)
		a[j]+=t>>j&1; 
	}
	long long ans=0;
	for(int i=0;i<62;++i){
		ans+=(1ll<<i)%mod*(a[i]*(a[i]-1)*(a[i]-2)/6%mod)%mod;
		ans+=(1ll<<i)%mod*((n-a[i])*(n-a[i]-1)*a[i]/2%mod)%mod;
		ans%=mod;
	}
	printf("%lld",ans);
}

C++(clang++11) 解法, 执行用时: 132ms, 内存消耗: 3856K, 提交时间: 2021-01-26 14:03:58

#include <iostream>
#define mod 1000000007
using namespace std;
long long cnt[100];
int main(int argc, char** argv) {
	int n;
	cin >> n;
	for(int i=1;i<=n;i++)
	{
		long long x;
		cin >> x;
		for(int i=0;i<=62;i++) cnt[i]+=x&1,x>>=1; 
	}
	long long ans=0;
	for(int i=0;i<=62;i++) ans+=((long long)1<<i)%mod*(cnt[i]*(cnt[i]-1)*(cnt[i]-2)/6%mod+cnt[i]*(n-cnt[i])*(n-cnt[i]-1)/2%mod)%mod,ans%=mod;
	cout << ans;
	return 0;
}

上一题