Good Bye 2020 E
Good Bye 2020 E
大意
给定 \(N\) 和 \(N\) 个数 \(x_1,x_2,...,x_n\) ,
求: \(\sum_{i=1}^n \sum_{j=1}^n \sum_{k=1}^n (x_i \, \& \, x_j) \cdot (x_j \, | \, x_k)\)
思路
说实话这种题第一时间应该想到位运算...我还是太菜了...
考虑一步简单变形 \(\sum_{i=1}^n \sum_{j=1}^n \sum_{k=1}^n (x_i \, \& \, x_j) \cdot (x_j \, | \, x_k) = \sum_{j=1}^n \sum_{i=1}^n (x_i \, \& \, x_j) \sum_{k=1}^n (x_j \, | \, x_k) = \sum_{j=1}^n \left[ \sum_{i=1}^n (x_i \, \& \, x_j) \right] \cdot \left[ \sum_{k=1}^n (x_j \, | \, x_k) \right]\)
然后我们想办法 \(\Theta(log)\) 统计方括号中的式子。
对于固定的 \(x_j\) ,\(\sum_{i=1}^n (x_i \, \& \, x_j)\) 的值就是 \(x_j\) 在二进制下的每一位,分别与 \(x_1,...,x_n\) 做 与 运算的值的累加。
更简单地说,就是 \(x_j\) 在二进制下的每一位,与 \(x_1,...,x_n\) 在二进制下相同的位数做 与 运算的值的累加。
对于 \(x_j\) 为 \(1\) 的位,答案显然就是 \(x_1,...,x_n\) 在二进制相同的位数为 \(1\) 的个数乘以此位代表的 \(2\) 的次幂的值的累加 。
对于 \(x_j\) 为 \(0\) ,显然为 \(0\)
这样对于 \(j\) ,我们在 \(logx_j\) 的时间内求出了答案。
对于 \(\sum_{k=1}^n (x_j \, | \, x_k)\) ,方法类似。
总之,复杂度为 \(\Theta(Nlog(max(x_i)))\)
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)const int mod = 1e9+7;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;int t, n, mx;
ll num[62];
ll a[500500];void deal(ll x) {int cnt=0;while(x) {if(x&1) ++num[cnt];x >>= 1;++cnt;}mx = max(mx, cnt);
}inline ll sol_1(ll x) {int cnt=0;ll tmp = 0;while(x && cnt <= mx) {if(x&1) {tmp = (tmp + ((1ll<<cnt)%mod*num[cnt]) % mod)%mod;}x >>= 1;++cnt;}return tmp;
}inline sol_2(ll x) {int cnt=0;ll tmp = 0;while(cnt <= mx) {if(x&1) {tmp = (tmp + ((1ll<<cnt)%mod*n)%mod)%mod;} else tmp = (tmp + ((1ll<<cnt)%mod*num[cnt]) % mod)%mod;x >>= 1;++cnt;}return tmp;
}int main() {ios::sync_with_stdio(false);cin.tie(0);cin >> t;ll t1, t2, ans;while(t--) {memset(num, 0, sizeof num);ans = mx = 0;cin >> n;for(int i=1; i<=n; i++) cin >> a[i], deal(a[i]);for(int i=1; i<=n; i++) {t1 = sol_1(a[i]);t2 = sol_2(a[i]);ans = (ans + (t1*t2)%mod) % mod;}cout << ans << endl;}return 0;
}
61min,-0
Good Bye 2020 E相关推荐
- Codeforces - Good Bye 2020
Codeforces - Good Bye 2020 前言 A - E 题解 2020的最后一场Codeforces,也算有点纪念意义吧- 赛时差1分钟调出e,一直被1<<i爆int迷惑了 ...
- Codeforces Good Bye 2020 补题记录
系列文章目录 文章目录 系列文章目录 前言 G. Song of the Sirens 前言 我是傻逼 G. Song of the Sirens 给定n和q,字符串s0和t,t的长度为n sis_i ...
- 【日程训练】算法脱贫计划
算法脱贫计划 前言 2020-12-26 2020-12-27 2020-12-28 ~ 2020-1-1 2021-1-1 ~ 2021-1-16 [寒假训练计划]2021-1-17 ~ 2021- ...
- Bye 2019,Hi ,我的鼠年 2020 ~
这是一条很奇怪的前言- 说句实在话,回顾 2019,展望 2020,早想动笔,却深陷回忆. 2019,经历了太多,太多. 时间过的真快,眨眼间,就仿佛在昨天. 曾经的我们,无数次的畅想未来,未来的未来 ...
- 2020年,5种将死的编程语言
来源 | 码农网 译者 | 小峰 曾几何时,几乎每个人都在使用Perl语言编程.但是那些经常使用的人慢慢地发现,关于这个Perl语言似乎总是有点不对劲.至少我知道有这么个叫做"pieceme ...
- 美团点评2020年测试工程师笔试题
VOL 155 04 2020-09 今天距2021年118天 这是ITester软件测试小栈第155次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上 ...
- 搜狗2020年测试工程师笔试题
VOL 151 21 2020-08 今天距2021年132天 这是ITester软件测试小栈第151次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上 ...
- 2020年,5 种 将死的编程语言!
来源 | 码农网 译者 | 小峰 曾几何时,几乎每个人都在使用Perl语言编程.但是那些经常使用的人慢慢地发现,关于这个Perl语言似乎总是有点不对劲.至少我知道有这么个叫做"pieceme ...
- 【转载】DayDayUp:2020,再见了,不平凡的一年,让我懂得了珍惜,让我明白了越努力越幸运
转自:https://yunyaniu.blog.csdn.net/article/details/112040074 DayDayUp:2020,再见了,不平凡的一年,让我懂得了珍惜,让我明白了越努 ...
- Python3基本用法 2020.2.20
Python3基本用法 2020.2.20 Python3简介 Python是一个高层次的结合了解释性.编译性.互动型和面向对象的脚本语言. Python的设计具有很强的可读 %8.5f格式说明符表示 ...
最新文章
- RocketMQ 实战 消息发送样例
- CISSP备考系列之行政性管理[10-37]
- boost::fusion::insert用法的测试程序
- .Net平台开源作业调度框架Quartz.Net
- python,文件md5校验
- ndows 内存诊断工具,win10内存诊断工具 win10自带内存诊断工具的使用
- 通过日志对内存泄漏的检查
- python检验多重共线性_python从机器学习角度处理共线性
- 干涉法测微小量(牛顿环测透镜的曲率半径)
- linux系统制作usb启动盘,教你制作Linux操作系统的USB启动盘
- 亚马逊抛出“下一代贸易链”整合解决方案:中国跨境电商如何借道转型?
- 【C++】复制省略(Copy elision)
- 超舒适!超强续航!南卡N2S蓝牙耳机全面评测!
- cad怎么将图层后置_CAD中如何将某一个图层置于其他图层之上???
- python装饰器原理wraps(method)(self)_理解Python中装饰器最佳方法~
- 宝塔docker安装Halo
- 荣耀x10max能否升级鸿蒙,坐拥豪华配置:荣耀X10 Max成今年唯一5G大屏手机
- Centos7安装MPICH3在配置安装目录时出现问题
- 华为方法:如何发展教练|内线?
- 使用IIS搭建本地Web服务器(手把手教程)