bzoj 3811: 玛里苟斯(期望+线性基)
3811: 玛里苟斯
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 223 Solved: 98
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
比较难的题
求出n个数的线性基,线性基中每个集合的异或和都唯一,并且属于满射
所以可以暴力线性基的所有集合异或和,然后加在一起除以2^cnt就是答案了(cnt为线性基元素个数)
但是线性基中最多有62个数,暴力是不行的
考虑按k分情况讨论
①k>=3:
因为答案不会超过long long范围,所以线性基中所有元素不会超过64/3个,可以直接暴力
不过注意一个坑:答案不会超过long long但是你计算所有异或和最后要除以2^cnt才是答案,所以计算所有贡献的过程中可能会爆long long,要边计算边除,也就是将val写成val/(2^cnt)和val%(2^cnt)两部分;
②k = 1:
不能暴力了,假设某个数ai转成二进制后第k位为1,因为这个数被选的概率刚好是1/2,并且很明显,无论它和谁异或,这个1一定都会有刚好1/2的概率对答案有贡献,所以可以发现答案就是所有数or起来/2
③k = 2:
假设某个集合的异或和为x,x转成二进制后是bm…b1b2b3(bm表示二进制第m位,0/1),那么x²就等于∑bibj*2^(i+j),当且仅当第i位第j位都为1时,对答案计算有2^(i+j)的贡献,用上面k=1的思想可以轻松得出这个概率是1/4(有00, 10, 01, 11四种情况各1/4),不过,当所有数第i位和第j位都相同时,概率会变为1/2(只有00,11两种情况),当所有数第i位都为0或者第j位都为0时概率为0
#include<stdio.h>
#define LL unsigned long long
LL a[100005], p[66], jz[66], er[66] = {1};
int main(void)
{LL ans, temp, mod, c, d;int i, j, k, cnt, n, flag;scanf("%d%d", &n, &k);for(i=1;i<=62;i++)er[i] = er[i-1]*2;for(i=1;i<=n;i++)scanf("%llu", &a[i]);if(k==1){ans = 0;for(i=1;i<=n;i++)ans |= a[i];printf("%llu", ans/2);if(ans%2)printf(".5");}else if(k==2){temp = 0;for(i=1;i<=n;i++)temp |= a[i];mod = ans = 0;for(i=62;i>=0;i--){for(j=62;j>=0;j--){if((temp&(1ll<<i))==0 || (temp&(1ll<<j))==0)continue;flag = 1;for(k=1;k<=n;k++){if((a[k]&(1ll<<i)) && (a[k]&(1ll<<j))==0 || (a[k]&(1ll<<i))==0 && (a[k]&(1ll<<j))){flag = 0;break;}}if(flag){ans += er[i+j]/2;mod += er[i+j]%2;}else{ans += er[i+j]/4;if(er[i+j]%4)mod++;}}}printf("%llu", ans+mod/2);if(mod%2)printf(".5");}else{cnt = 0;for(i=1;i<=n;i++){for(j=62;j>=0;j--){if(a[i]&(1ll<<j)){if(p[j]==0){p[j] = a[i];jz[cnt++] = p[j];break;}elsea[i] ^= p[j];}}}ans = mod = 0;for(i=0;i<(1ll<<cnt);i++){temp = 0;for(j=0;j<=cnt-1;j++){if(i&(1ll<<j))temp ^= jz[j];}c = 0, d = 1;for(j=1;j<=k;j++){c *= temp, d *= temp;c += d/er[cnt], d %= er[cnt];}ans += c, mod += d;ans += mod/er[cnt], mod %= er[cnt];}printf("%llu", ans);if(mod)printf(".5");}printf("\n");return 0;
}
bzoj 3811: 玛里苟斯(期望+线性基)相关推荐
- bzoj 3811: 玛里苟斯【线性基+期望dp】
这个输出可是有点恶心啊--WA*inf,最后抄了别人的输出方法orz 还有注意会爆long long,要开unsigned long long 对于k==1,单独考虑每一位i,如果这一位为1则有0.5 ...
- 【BZOJ3811】玛里苟斯(线性基)
[BZOJ3811]玛里苟斯(线性基) 题面 BZOJ 题解 \(K=1\)很容易吧,拆位考虑贡献,所有存在的位出现的概率都是\(0.5\),所以答案就是所有数或起来的结果除二. \(K=2\)的情况 ...
- bzoj 3811 玛里苟斯 - 线性基
题目传送门 传送门I 传送门II 题目大意 给定集合$S$,问集合$S$的任意选一个子集的异或和的$k$次幂期望. 保证答案在$2^{63}$内. 注意到答案在$2^{63}$内,所以,当$k \ge ...
- [BZOJ 3811]玛里苟斯(线性基)尽量理解的题解
文章目录 title solution code title 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,-,an}. 等概率随 ...
- [BZOJ3811][UOJ#36][清华集训2014]玛里苟斯(期望 + 线性基)
Address BZOJ 3811 UOJ #36 Solution 看到异或,首先想到拆位 下面 xor ( A ) \text{xor}(A) xor(A) 表示子集 A A A 的异或和, b ...
- uoj#36. 【清华集训2014】玛里苟斯(线性基+概率期望)
传送门 为啥在我看来完全不知道为什么的在大佬们看来全都是显然-- 考虑\(k=1\)的情况,如果序列中有某一个\(a_j\)的第\(i\)位为\(1\),那么\(x\)的第\(i\)位为\(1\)的概 ...
- bzoj 3811: 玛里苟斯
3811: 玛里苟斯 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 190 Solved: 95 [Submit][Status][Discuss ...
- BZOJ 2115 [Wc2011] Xor ——线性基
[题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...
- BZOJ 2460: [BeiJing2011]元素 线性基
2460: [BeiJing2011]元素 Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔 法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法 ...
最新文章
- mysql什么格式转换_MySQL日期格式转换
- 递归函数练习——累乘
- spring boot整合JPA实现多条件查询并分页
- linux uboot启动流程分析,uboot启动流程分析
- 软件质量管理之困境与对策思考
- 同比 数据模型 环比_历史数据模型解决方案-历史数据模型解决方案
- [深度学习-实践]Transformer模型训练IMDB-tensorflow2 keras
- Python中tkinter.filedialog
- silverlight3.0 怎么调试XAML对应的XAML.CS文件
- 手机 android.downloader病毒,Android手机出现史上最强木马 感染后无法删除
- android缅甸语,关于unicode:Android中的缅甸语言
- imazing是什么?iPhone苹果第三方iOS设备管理软件
- 温度传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- micropython esp8266 红外控制小车
- 报错:跨域问题解决 No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
- Go设置一个工作区打开多个项目
- 可编程计数器/定时器8253和8254
- Spring的四种注入方式
- 【数据格式化】数字货币加逗号隔开
- SpringBoot+Vue实现前后端分离的汽车配件销售管理系统