【洛谷5390】[Cnoi2019] 数学作业(位运算)
大致题意: 给你一个集合,求所有子集异或和之和。
大致思路
首先,我们很容易想到去对二进制下每一位分别讨论。
枚举当前位,并设共有\(x\)个数当前位上为\(1\),则有\((n-x)\)个数当前位上为\(0\)。
对于\(x=0\)显然无法使这一位为\(1\),否则当且仅当选取的子集中有奇数个数这一位上为\(1\),这一位异或之后才会为\(1\)。
又由于这一位为\(0\)的数选与不选毫无影响,因此这一位为\(1\)的方案数为\(x\)个数中选取奇数个数的方案数乘上\(2^{n-x}\)。
则我们主要考虑如何求\(x\)个数中选取奇数个数的方案数。
容易想到去猜测\(x\)个数中选取奇数个数的方案数与选取偶数个数的方案数相同,即皆为\(2^{x-1}\)。
实际上,由二项式定理我们可知:
\]
由这个式子就可以推得上面的结论是正确的了。
所以对于任意\(x≠0\)的一位,其方案数即为\(2^{x-1}\cdot2^{n-x}=2^{n-1}\)。
综上,我们得出结论:对于二进制下第\(k\)位,若这一位有\(1\),则可产生\(2^k\cdot2^{n-1}\)的贡献。
因此将所有数或起来,然后乘上\(2^{n-1}\)就是答案了。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define X 998244353
using namespace std;
int n;
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C^FS?FO[C++]=c:(fwrite(FO,1,C,stdout),FO[(C=0)++]=c))
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T,C;char c,*A,*B,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
I void clear() {fwrite(FO,1,C,stdout),C=0;}
}F;
I int Qpow(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}//快速幂
int main()
{
RI Tt,i,s,x;F.read(Tt);W(Tt--)
{
for(F.read(n),s=0,i=1;i<=n;++i) F.read(x),s|=x;//统计所有数或值
F.writeln(1LL*s*Qpow(2,n-1)%X);//乘上2的n-1次方
}return F.clear(),0;
}
【洛谷5390】[Cnoi2019] 数学作业(位运算)的更多相关文章
- 【洛谷 P4934】 礼物 (位运算+DP)
题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...
- 洛谷P3216 [HNOI2011] 数学作业 [矩阵加速,数论]
题目传送门 数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N和 M,要求计算 Concatenate (1 .. N)Mod M 的值,其中 C ...
- 洛谷P3216 [HNOI2011]数学作业
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...
- 【洛谷】【线段树+位运算】P2574 XOR的艺术
[题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...
- 洛谷 P3216 [HNOI2011]数学作业
最近学了矩阵,kzj大佬推荐了我这一道题目. 乍一眼看上去,没看出是矩阵,就随便打了一个暴力,30分. 然后仔细分析了一波,发现蛮简单的. 结果全wa了,先看看下面的错误分析吧! 首先,设f[n]为最 ...
- [bzoj2326] [洛谷P3216] [HNOI2011] 数学作业
想法 最初的想法就是记录当前 \(%m\) 值为cur,到下一个数时 \(cur=cur \times 10^x + i\) n这么大,那就矩阵乘法呗. 矩阵乘法使用的要点就是有一个转移矩阵会不停的用 ...
- 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数
洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- P5390 [Cnoi2019]数学作业
P5390 [Cnoi2019]数学作业求子集异或和的和拆成2进制,假设有x个数这一位为1,剩下n-x个数对答案没有贡献,对于这一位而言,对答案的贡献就是,x个数选奇数个数的方案数*2^(n-x).由 ...
- 洛谷试炼场-简单数学问题-P1088 火星人
洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...
随机推荐
- phonegap for andriod之phonegap 环境的搭建
1.环境搭建 1.1安卓的环境搭建 可以参考http://www.cnblogs.com/xuzhiwei/p/3277529.html 1.2PhoneGap下载 我这里下载2.90版本 http: ...
- 在谷歌地图上绘制行政区域轮廓【结合高德地图的API】
实现思路: 1.利用高德地图行政区域API获得坐标列表 2.将坐标列表绘制在谷歌地图上[因为高德地图和国内的谷歌地图都是采用GCJ02坐标系,所有误差很小,可以不进行坐标误差转换] 注意点: 1.用百 ...
- Chapter11
package scala import scala.collection.mutable /** * Created by EX-CHENZECHAO001 on 2018-04-03. */cla ...
- Phpstorm Git 操作
一.前提: 1.下载并安装好 Phpstorm 2.下载并安装好 Git 3.熟悉 Git 相关命令行操作 二.Git pull & commit(add): 下面简单说一下相关操作: Php ...
- UVALive - 6440
题目链接:https://vjudge.net/contest/241341#problem/G Indonesia, as well as some neighboring Southeast As ...
- Linux Shell命令系列(2)
6. history命令 “history”命令就是历史记录.它显示了在终端中所执行过的所有命令的历史. 7. sudo命令 “sudo”(super user do)命令允许授权用户执行超级用户或者 ...
- 在Scala IDEA for Eclipse或IDEA里程序编译实现与在Spark Shell下的对比(其实就是那么一回事)
不多说,直接上干货! 比如,我这里拿主成分分析(PCA). 1.主成分分析(PCA)的概念介绍 主成分分析(PCA) 是一种对数据进行旋转变换的统计学方法,其本质是在线性空间中进行一个基变换,使得变换 ...
- HTML <pre> 标签
需求 错落有致的规则说明 ps.我真的是一个后端开发... pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体.
- Java学习笔记--字符串和文件IO
1.Java中的字符串类和字符的表示 2.区分String,StringBuilder和StringBuffer 3.从命令行中给main方法传递参数 4.文件操作 1 Java中的字符串和字符 1. ...
- ORACLE将查询的多条语句拼在一个字段下
select listagg(字段名,'分隔符') within group (order by 某个字段)