NC205862. 异或和之和
描述
输入描述
第一行一个正整数 。
接下来有 个正整数 。
输出描述
任取三个数、三元组内部位异或后求和对取模的值。
示例1
输入:
4 3 4 5 6
输出:
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; }