题目链接:【清华集训 2014】玛里苟斯
推荐博客:【BZOJ 3811】玛里苟斯:线性基(详细证明)

首先想到将kkk分类讨论。

k=1" role="presentation" style="position: relative;">k=1k=1k=1时,我们考虑每一位的贡献。若有至少一个数第iii位为1" role="presentation" style="position: relative;">111,则对答案的贡献为valuei2valuei2\frac{value_i}{2}。

k=2k=2k=2时,发现每个异或和的平方为∑i∑j2i+jbitibitj∑i∑j2i+jbitibitj\sum_{i}\sum_{j}{2^{i+j}bit_ibit_j}。那么考虑第iii位和第j" role="presentation" style="position: relative;">jjj位的积的期望值。如果所有的数中,第iii位和第j" role="presentation" style="position: relative;">jjj位均相等且非全零,那么参考k=1k=1k=1的情况,期望为1212\frac{1}{2};否则,第iii位为1" role="presentation" style="position: relative;">111的概率为1212\frac{1}{2},第jjj位为1" role="presentation" style="position: relative;">111的概率为1212\frac{1}{2},i×ji×ji\times j为111的概率为14" role="presentation" style="position: relative;">1414\frac{1}{4}。

k≥3k≥3k\ge 3时, 由于答案不超过2632632^{63},所以每个数不超过2212212^{21},所以线性基个数不超过212121,则可以暴力枚举异或和来计算答案了。注意精度问题。

我怀疑我学了假的线性基模版···

#include <cstdio>
#include <iostream>
const int maxn = 100005;
typedef unsigned long long ull;
int n, m, k;
ull a[maxn], base[maxn], b[maxn];
void solve1() {ull ans = 0;for (int i = 1; i <= n; i++) {ans |= a[i];}printf("%llu", ans >> 1);if (ans & 1) {printf(".5");}putchar('\n');
}
void solve2() {ull ans = 0, res = 0;for (int i = 32; i >= 0; i--) {for (int j = 32; j >= 0; j--) {bool flag0 = 0, flag1 = 0, flag = 0;for (int k = 1; k <= n; k++) {flag0 |= a[k] >> i & 1;flag1 |= a[k] >> j & 1;flag |= (a[k] >> i & 1) != (a[k] >> j & 1);}if (!flag0 || !flag1) {continue;}if (i + j - flag - 1 < 0) {res++;} else {ans += 1ull << (i + j - flag - 1);}}}ans += res >> 1;printf("%llu", ans);if (res & 1) {printf(".5");}putchar('\n');
}
void solve3() {ull ans = 0, res = 0;for (int i = 1; i <= n; i++) {for (int j = 22; j >= 0; j--) {if (a[i] >> j & 1) {if (base[j]) {a[i] ^= base[j];} else {base[j] = a[i];b[++m] = a[i];break;}}}}for (int i = 0; i < 1 << m; i++) {ull val = 0;for (int j = 1; j <= m; j++) {if (i >> (m - j) & 1) {val ^= b[j];}}ull a = 0, b = 1;for (int j = 1; j <= k; j++) {a *= val, b *= val;a += b >> m, b &= (1 << m) - 1;}ans += a, res += b;ans += res >> m, res &= (1 << m) - 1;}printf("%llu", ans);if (res) {printf(".5");}putchar('\n');
}
int main() {scanf("%d %d", &n, &k);for (int i = 1; i <= n; i++) {scanf("%llu", a + i);}if (k == 1) {solve1();} else if (k == 2) {solve2();} else {solve3();}return 0;
}

【清华集训 2014】玛里苟斯(组合计数 + 线性基)相关推荐

  1. [BZOJ3811][UOJ#36][清华集训2014]玛里苟斯(期望 + 线性基)

    Address BZOJ 3811 UOJ #36 Solution 看到异或,首先想到拆位 下面 xor ( A ) \text{xor}(A) xor(A) 表示子集 A A A 的异或和, b ...

  2. 清华集训2014 玛里苟斯

    清华集训2014 玛里苟斯 求子集异或和k次方的期望. 异或考虑按位算贡献. 对于\(K=1\),考虑异或和\(\frac{x}{2}\)就是答案. 证明简单来说就是,你可以先打一个概率\(dp\)分 ...

  3. [清华集训2014]玛里苟斯(线性基+概率期望)

    首先有一些前置引理: 1. 由期望的线性性,平方的期望不等于期望的平方,所以求k次方的期望时,需要记录1~k-1的期望,然后计算增量(OSU!),这个这题没用上. 2. 线性基是可以变成每位只在一个元 ...

  4. [清华集训D1T1][Bzoj 3811][思维+线性基]玛里苟斯

    想像一下,我们将异或值x拆成若干个2的次方加在一起,那么k次方的意义便是: 从这些2次方中挑出k个(有序)2次方,将它们乘起来的和. 具体一点,bi是x的二进制表达从右往左的第i+1位,于是x可以拆成 ...

  5. [清华集训2014]玛里苟斯

    一.题目 点此看题 二.解法 注意到答案是2632^{63}263次方,可以分kkk来讨论: k=1k=1k=1,求出所有值或起来的值,每一位有12\frac{1}{2}21​的概率有贡献,所以把这个 ...

  6. 玛里苟斯[清华集训2014 Day1]

    玛里苟斯[清华集训2014 Day1] 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,-,an}. 等概率随机取 S 的一个子集  ...

  7. 【清华集训2014】Sum)(类欧几里得算法)

    [清华集训2014]Sum 然后本质上我们需要求解的就是那个带根号式子的奇偶性,然后我们发现这个式子很像是类欧几里得算法,求解一个斜率为无理数直线下的整点个数,然后我们直接对于一般形式求解,那么就是每 ...

  8. 【清华集训2014】玛里苟斯(数学 线性基)

    original link - http://uoj.ac/problem/36 题意: 有一个多重集S={a1,a2,...an}S=\{a_1,a_2,...a_n\}S={a1​,a2​,... ...

  9. uoj#36. 【清华集训2014】玛里苟斯(线性基+概率期望)

    传送门 为啥在我看来完全不知道为什么的在大佬们看来全都是显然-- 考虑\(k=1\)的情况,如果序列中有某一个\(a_j\)的第\(i\)位为\(1\),那么\(x\)的第\(i\)位为\(1\)的概 ...

最新文章

  1. 报错解决:cannot import name 'conditional' from 'hyperas.distributions'
  2. PHP带头大哥谈程序语言的学习体会!
  3. ubuntu 安装 spconv
  4. java libpcap,Linux下编译安装libpcap
  5. C 风格字符串与C++中string类区别
  6. Adobe称Flash技术遭排斥 呼吁政府介入
  7. 面试题19:二叉树镜像
  8. 在线解析解码jwt token工具
  9. 2022年互联网+全国大学生创新创业大赛解读
  10. 国外RSGIS权威期刊杂志
  11. 微商深度揭秘——减肥产品、推广方法
  12. login.defs文件基础
  13. Ubuntu 12.04无法识别华为U8500
  14. 局部阈值matlab代码,matlab局部自适应阈值
  15. 从5.56*45mm NATO弹看塔科夫的数据严谨性
  16. android monkey,Android Monkey搭建 你不用了解的
  17. Hazelcast Jet DAG原理
  18. 双极性正弦脉冲宽度调制
  19. Kafka系列二——消息发送send方法源码分析
  20. 深度清理win10系统C盘文件(二)

热门文章

  1. SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪
  2. verilog基本语法学习笔记
  3. python实战演练_《Python高效开发实战》实战演练——基本视图3
  4. 解决win10下localhost打不开的问题
  5. 中国人寿信息技术部实习总结
  6. 《C语言点滴》参考文献
  7. c语言编辑电子实时时钟,可以调整时间的电子时钟-C语言
  8. Java笨狗groovy学习笔记—Regular Expressions
  9. Java面试--堆和栈的概念和区别
  10. 房价预测(基于决策树算法)