题解【Luogu P6102 谔运算】
\]
- 给出一个长度为 \(n\) 的数列 \(a\),求 \(\sum\limits_{i=1}\limits^{n}\sum\limits_{j=1}\limits^{n}\sum\limits_{k=1}\limits^{n}\sum\limits_{l=1}\limits^{n}(a_i \ \text{or} \ a_j) \ \text{xor} \ (a_k \ \text{and} \ a_l)\) 。
\]
先考虑下普通的谔运算 \((a \ \text{or} \ b) \ \text{xor} \ (c \ \text{and} \ d)\) 什么时候为真(\(a,b,c,d \in \{ 0,1 \}\)),我们发现 \(a,b,c,d\) 一共有 \(16\) 种取值,其中有 \(10\) 种取值使得式子为真:
\(a = 0, b = 0, c = 1, d = 1\) ;
\(a = 0, b = 1, c = 0, d = 0\) ;
\(a = 0, b = 1, c = 0, d = 1\) ;
\(a = 0, b = 1, c = 1, d = 0\) ;
\(a = 1, b = 0, c = 0, d = 0\) ;
\(a = 1, b = 0, c = 0, d = 1\) ;
\(a = 1, b = 0, c = 1, d = 0\) ;
\(a = 1, b = 1, c = 0, d = 0\) ;
\(a = 1, b = 1, c = 0, d = 1\) ;
\(a = 1, b = 1, c = 1, d = 0\) 。然后考虑按位分组计算贡献。
详细地说:\((a \ \text{or} \ b) \ \text{xor} \ (c \ \text{and} \ d)\) 得到的数,若第 \(i\) 位为真,则对答案有 \(2^i\) 的贡献。由于谔运算是按位处理的,也就是说我们可以计算出对答案有贡献的数中,有多少个数第 \(i\) 位为真,若将这个量记为 \(c_i\) ,最后答案即为 \(\sum\limits_{i=0}\limits^{31}c_i \times 2^i\) 。
我们记 \(cnt[i,j]\) 表示 \(a\) 中有多少数第 \(i\) 位为 \(j\) ,可以 \(\text{O(32n)}\) 预处理。
然后按位分组计算贡献,根据乘法原理和加法原理,从 \(a\) 中选出 \(4\) 个数进行谔运算,第 \(i\) 位为真的四元组有 \(cnt[i,0] \times cnt[i,0] \times cnt[i,1] \times cnt[i,1] + cnt[i,0] \times cnt[i,1] \times cnt[i,0] \times cnt[i,0] + ......\) ,最后将其乘上 \(2^i\) 计入答案中。
注意到此题的膜数为 \(2^{32}\) ,所以 ,记得要开 \(\text{unsigned} \ \text{int}\)。
时间复杂度 \(\text{O(32n)}\) 。
\]
#include<cstdio>
#include<iostream>
#define RI register int
using namespace std;
namespace IO
{
static char buf[1<<20],*fs,*ft;
inline char gc()
{
if(fs==ft)
{
ft=(fs=buf)+fread(buf,1,1<<20,stdin);
if(fs==ft)return EOF;
}
return *fs++;
}
#define gc() getchar()
inline int read()
{
unsigned int x=0,f=1;char s=gc();
while(s<'0'||s>'9')s=gc();
while(s>='0'&&s<='9')x=x*10+s-'0',s=gc();
return x*f;
}
}using IO::read;
const int N=500100;
int n;
int a[N];
unsigned int cnt[33][2];
unsigned int ans;
int main()
{
n=read();
for(RI i=1;i<=n;i++)
a[i]=read();
for(RI i=1;i<=n;i++)
for(RI j=0;j<32;j++)
cnt[j][(a[i]>>j)&1]++;
for(RI i=0;i<32;i++)
{
unsigned int c=0;
c+=cnt[i][0]*cnt[i][0]*cnt[i][1]*cnt[i][1];
c+=cnt[i][0]*cnt[i][1]*cnt[i][0]*cnt[i][0];
c+=cnt[i][0]*cnt[i][1]*cnt[i][0]*cnt[i][1];
c+=cnt[i][0]*cnt[i][1]*cnt[i][1]*cnt[i][0];
c+=cnt[i][1]*cnt[i][0]*cnt[i][0]*cnt[i][0];
c+=cnt[i][1]*cnt[i][0]*cnt[i][0]*cnt[i][1];
c+=cnt[i][1]*cnt[i][0]*cnt[i][1]*cnt[i][0];
c+=cnt[i][1]*cnt[i][1]*cnt[i][0]*cnt[i][0];
c+=cnt[i][1]*cnt[i][1]*cnt[i][0]*cnt[i][1];
c+=cnt[i][1]*cnt[i][1]*cnt[i][1]*cnt[i][0];
ans+=c*(1<<i);
}
printf("%u\n",ans);
return 0;
}
\]
题解【Luogu P6102 谔运算】的更多相关文章
- [题解] Luogu P5446 [THUPC2018]绿绿和串串
[题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...
- 题解 Luogu P2499: [SDOI2012]象棋
关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...
- 题解 luogu P1144 【最短路计数】
本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...
- 题解 Luogu P1110 【[ZJOI2007]报表统计】
感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...
- 题解 Luogu P3370
讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 ...
- 题解 Luogu P3623 [APIO2008]免费道路
[APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...
- [题解]luogu P4116 Qtree3
终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都 ...
- 题解 Luogu P3959 【宝藏】
来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ...
- 题解 Luogu P1099 【树网的核】
这题是真的水啊... ------------ 昨天模拟赛考了这题,很多人都是O($n^3$)水过,但我认为,要做就做的足够好(其实是我根本没想到O($n^3$)的做法),然后就开始想O(n)的解法. ...
随机推荐
- Ado.net总结-Command(指挥官)
Command 概述 在 System.Data.SqlClient 命名空间下,对应的 Command 类为 SqlCommand,在创建 SqlCommand 实例前必须已经创建了与数据库的连接. ...
- HTML 图片(image) 左右滑动
1.需求 需要用简单动画的形式将一组图片进行展示,图片数量不固定 2.效果如下: 3.思路 说到动画,首先想到使用-webkit-transition:;因为这个最简单好用,首先将图片都放在左侧,然后 ...
- Navicat10.1.11使用记录
设计表的时候有个允许空值(null),如果不勾选,则无法插入null(但是可以插入‘null’),且默认值不能为null: 如果某个字段没有设置默认值,而插入时又没有给此字段赋值,则会提示warnin ...
- 1、Vue 实战-入门篇
先决条件:需要 Node.js . npm 基础. 如果没有基础看先看下面简单的两点介绍. 1.npm 命令介绍. 1.所有命令 -h 可以查看.也可以从官网查 docs,结果如下. --help ...
- GitHub高级搜索指南
还在为自学时找不到适合练手的项目而苦恼? 还在好奇别人是如何在GitHub众多项目中找到高质量代码的? 真的是因为他们独具慧眼吗? 不,其实他们只是掌握了正确的搜索方法. 下面介绍几种常用的GitHu ...
- python 父类方法重写
class Bird: def isWing(self): print("鸟有翅膀") def fly(self): print("鸟会飞") class Os ...
- Mysql 8+ 版本完全踩坑记录
问题是这样 刚霍霍了一台腾讯云服务器需要安装mysql 然后就选择了8+这个版本. 安装步骤网上有的是. 我只写最主要的部分 绝对不出错 外网可访问 .net java都可以调用 其实不指望有人看 就 ...
- [UVA1494] Qin Shi Huang's National Road System
题目 戳这里 题解 从今天起我要改邪归正,好好刷题准备联赛! 这是一道经典的最小生成树题目. 枚举每一条边作为道士要修的路,求出包含这条边的最小生成树. 先求出原图的最小生成树. 如果要删的边在最小生 ...
- Beat our dice game and get the flag 击败我们的骰子游戏拿到旗子
文件名:ebCTF-Teaser-BIN100-Dice.exe 话不多说 用PEID一看没壳 拖进OD 让我们摇出31337这五个数字才能拿到正确的flag cmp dword ptr ss:[eb ...
- linux DNS 服务器 配置
1:named.conf 2:正向区域配置文件 3:反向域名解析文件