P10114 [LMXOI Round 1] Size

题目背景

在漆黑的夜晚,魔女带走了 LMX,HQZ 为了拯救 LMX。要完成魔女给出的任务。

题目描述

魔女给出一个长度为 nnn 的序列 ddd,魔女想要求得:

∑i=1n∑j=1n((di⊕dj)+(di⊗dj))\sum\limits_{i=1}^{ n}\sum\limits_{j=1}^{n}{((d_i\oplus d_j)+(d_i \otimes d_j))}i=1nj=1n((didj)+(didj))

其中定义 ⊕\oplus 代表二进制下两数相加的和数位上 111 的个数, ⊗\otimes 代表二进制下较大减较小的差数位上 111 的个数。

输入格式

一行一个整数 nnn 表示序列的长度。

第二行 nnn 个非负整数,表示序列 ddd

输出格式

一行一个整数表示答案。

输入输出样例 #1

输入 #1

2
1 3 

输出 #1

7

输入输出样例 #2

输入 #2

10
114514 19 19 810 1477 44151 15260 369 2010 222

输出 #2

1396

说明/提示

样例解释 #1

如下表所示,因此答案为 1+2+2+2=71 + 2 + 2 + 2 = 71+2+2+2=7

iii jjj ansansans
111 111 111
111 222 222
222 111 222
222 222 222

对于 100%100 \%100% 的数据,保证 1≤n≤2×106,∑di≤5×1071 \le n\le 2\times 10^6,\sum\limits d_i\le5\times10^71n2×106,di5×107

子任务编号 nnn 特殊性质 分值
Subtask #1 $\le 2\times10^6 $ di=1d_i =1di=1 101010
Subtask #2 ≤5000\le 50005000 202020
Subtask #3 ≤2×106\le 2\times 10^62×106 did_idi222 的次幂 303030
Subtask #4 ≤2×106\le 2\times 10^62×106 404040

C++实现

#include<bits/stdc++.h>
using namespace std;
const int N=5e7+5;
template<typename T>inline void read(T &x){
    x=0;int f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')
		f=-1;c=getchar();}
    while(isdigit(c)) 
		x=(x<<1)+(x<<3)+(c^48),c=getchar();
    x*=f;
}
int n,cnt[N],d,a[N],len;
long long ans;
inline int calc(int x){
    int res=0;
    while(x) 
		++res,x-=x&-x;
    return res;
}
int main(){
    read(n);
    while(n--){
        read(d);
        if(cnt[d]++==0) a[++len]=d;
    }
    for(int i=1;i<=len;++i)
        for(int j=1;j<=len;++j)
            ans+=1ll*cnt[a[i]]*cnt[a[j]]*(calc(a[i]+a[j])+calc(abs(a[i]-a[j])));
    printf("%lld",ans);
    return 0;
}


在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

更多推荐