【清华集训 2014】玛里苟斯(组合计数 + 线性基)
题目链接:【清华集训 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】玛里苟斯(组合计数 + 线性基)相关推荐
- [BZOJ3811][UOJ#36][清华集训2014]玛里苟斯(期望 + 线性基)
Address BZOJ 3811 UOJ #36 Solution 看到异或,首先想到拆位 下面 xor ( A ) \text{xor}(A) xor(A) 表示子集 A A A 的异或和, b ...
- 清华集训2014 玛里苟斯
清华集训2014 玛里苟斯 求子集异或和k次方的期望. 异或考虑按位算贡献. 对于\(K=1\),考虑异或和\(\frac{x}{2}\)就是答案. 证明简单来说就是,你可以先打一个概率\(dp\)分 ...
- [清华集训2014]玛里苟斯(线性基+概率期望)
首先有一些前置引理: 1. 由期望的线性性,平方的期望不等于期望的平方,所以求k次方的期望时,需要记录1~k-1的期望,然后计算增量(OSU!),这个这题没用上. 2. 线性基是可以变成每位只在一个元 ...
- [清华集训D1T1][Bzoj 3811][思维+线性基]玛里苟斯
想像一下,我们将异或值x拆成若干个2的次方加在一起,那么k次方的意义便是: 从这些2次方中挑出k个(有序)2次方,将它们乘起来的和. 具体一点,bi是x的二进制表达从右往左的第i+1位,于是x可以拆成 ...
- [清华集训2014]玛里苟斯
一.题目 点此看题 二.解法 注意到答案是2632^{63}263次方,可以分kkk来讨论: k=1k=1k=1,求出所有值或起来的值,每一位有12\frac{1}{2}21的概率有贡献,所以把这个 ...
- 玛里苟斯[清华集训2014 Day1]
玛里苟斯[清华集训2014 Day1] 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,-,an}. 等概率随机取 S 的一个子集 ...
- 【清华集训2014】Sum)(类欧几里得算法)
[清华集训2014]Sum 然后本质上我们需要求解的就是那个带根号式子的奇偶性,然后我们发现这个式子很像是类欧几里得算法,求解一个斜率为无理数直线下的整点个数,然后我们直接对于一般形式求解,那么就是每 ...
- 【清华集训2014】玛里苟斯(数学 线性基)
original link - http://uoj.ac/problem/36 题意: 有一个多重集S={a1,a2,...an}S=\{a_1,a_2,...a_n\}S={a1,a2,... ...
- uoj#36. 【清华集训2014】玛里苟斯(线性基+概率期望)
传送门 为啥在我看来完全不知道为什么的在大佬们看来全都是显然-- 考虑\(k=1\)的情况,如果序列中有某一个\(a_j\)的第\(i\)位为\(1\),那么\(x\)的第\(i\)位为\(1\)的概 ...
最新文章
- 报错解决:cannot import name 'conditional' from 'hyperas.distributions'
- PHP带头大哥谈程序语言的学习体会!
- ubuntu 安装 spconv
- java libpcap,Linux下编译安装libpcap
- C 风格字符串与C++中string类区别
- Adobe称Flash技术遭排斥 呼吁政府介入
- 面试题19:二叉树镜像
- 在线解析解码jwt token工具
- 2022年互联网+全国大学生创新创业大赛解读
- 国外RSGIS权威期刊杂志
- 微商深度揭秘——减肥产品、推广方法
- login.defs文件基础
- Ubuntu 12.04无法识别华为U8500
- 局部阈值matlab代码,matlab局部自适应阈值
- 从5.56*45mm NATO弹看塔科夫的数据严谨性
- android monkey,Android Monkey搭建 你不用了解的
- Hazelcast Jet DAG原理
- 双极性正弦脉冲宽度调制
- Kafka系列二——消息发送send方法源码分析
- 深度清理win10系统C盘文件(二)