Address

  • BZOJ 3811
  • UOJ #36

Solution

  • 看到异或,首先想到拆位
  • 下面 xor ( A ) \text{xor}(A) xor(A) 表示子集 A A A 的异或和, b i t ( x , i ) bit(x,i) bit(x,i) 表示 x x x 的第 i i i 个二进制位(最低二进制位为第 0 0 0 位)
  • 可以得出
  • a n s = E ( xor ( A ) k , A ⊂ S ) = E ( ( ∑ i ≥ 0 b i t ( xor ( A ) , i ) 2 i ) k ) ans=E(\text{xor}(A)^k,A\subset S)=E((\sum_{i\ge 0}bit(\text{xor}(A),i)2^i)^k) ans=E(xor(A)k,A⊂S)=E((i≥0∑​bit(xor(A),i)2i)k)
  • = E ( ∑ i 1 ≥ 0 ∑ i 2 ≥ 0 ⋯ ∑ i k ≥ 0 2 ∑ j = 1 k i j ∏ j = 1 k b i t ( xor ( A ) , i j ) ) =E(\sum_{i_1\ge 0}\sum_{i_2\ge 0}\dots\sum_{i_k\ge 0}2^{\sum_{j=1}^ki_j}\prod_{j=1}^kbit(\text{xor}(A),i_j)) =E(i1​≥0∑​i2​≥0∑​⋯ik​≥0∑​2∑j=1k​ij​j=1∏k​bit(xor(A),ij​))
  • = ∑ i 1 ≥ 0 ∑ i 2 ≥ 0 ⋯ ∑ i k ≥ 0 2 ∑ j = 1 k i j E ( ∏ j = 1 k b i t ( xor ( A ) , i j ) ) =\sum_{i_1\ge 0}\sum_{i_2\ge 0}\dots\sum_{i_k\ge 0}2^{\sum_{j=1}^ki_j}E(\prod_{j=1}^kbit(\text{xor}(A),i_j)) =i1​≥0∑​i2​≥0∑​⋯ik​≥0∑​2∑j=1k​ij​E(j=1∏k​bit(xor(A),ij​))
  • 发现 E ( ∏ j = 1 k b i t ( xor ( A ) , i j ) ) E(\prod_{j=1}^kbit(\text{xor}(A),i_j)) E(∏j=1k​bit(xor(A),ij​)) 实际上就是 xor ( A ) \text{xor}(A) xor(A) 的 i 1 , i 2 , … , i k i_1,i_2,\dots,i_k i1​,i2​,…,ik​ 这几个二进制为全部为 1 1 1 的概率
  • 然后我们的问题转化成对于一个大小不超过 k k k 的集合 T T T
  • 有多少个 S S S 的子集 A A A 满足对于任意 i ∈ T i\in T i∈T 都满足 xor ( A ) \text{xor}(A) xor(A) 的二进制位 i i i 为 1 1 1
  • 使用线性基解决这个问题
  • 就二进制位集合 T 内的所有二进制位建出所有数的线性基
  • 如果这个线性基无法异或出使 T T T 内所有二进制位都为 1 1 1 的数,那么合法的子集数显然是 0 0 0
  • 否则为 2 自 由 元 个 数 2^{自由元个数} 2自由元个数
  • 有了每个大小 ≤ k \le k ≤k 的二进制位集合在 xor ( A ) \text{xor}(A) xor(A) 中对应的位值全为 1 1 1 的方案数之后,我们就能较为方便地统计答案了
  • 注意两个细节
  • (1)要用 unsigned long long
  • (2)直接用 printf("%g\n", ans);会输出形如 num1enum2 ( n u m 1 num1 num1 为实数, n u m 2 num2 num2 为整数)的结果而不是精确值,但我们可以证明答案的 2 2 2 倍一定是个整数,使用整数部分和小数部分模拟即可

Code

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>typedef unsigned long long ull;inline ull read()
{ull res = 0; bool bo = 0; char c;while (((c = getchar()) < '0' || c > '9') && c != '-');if (c == '-') bo = 1; else res = c - 48;while ((c = getchar()) >= '0' && c <= '9')res = (res << 3) + (res << 1) + (c - 48);return bo ? ~res + 1 : res;
}template <class T>
inline T Max(const T &a, const T &b) {return a > b ? a : b;}const int N = 1e5 + 5, M = 70;int n, k, tot, bi[M], cc[M], fac[M], C[M][M];
ull a[N];
bool is[M];struct point5
{ull num; bool is;friend inline point5 operator + (point5 a, point5 b){point5 res = (point5) {a.num + b.num, 0};res.is = a.is ^ b.is;if (a.is && b.is) res.num++;return res;}
} ans;struct Base
{int n;ull bas[M];bool vis[M];void init(int _n){n = _n;memset(vis, 0, sizeof(vis));}void ins(ull x){for (int i = n; i >= 0; i--){if (!((x >> i) & 1)) continue;if (vis[i]) x ^= bas[i];else return (void) (vis[i] = 1, bas[i] = x);}}bool check(ull x){ull res = 0;for (int i = n; i >= 0; i--){if (!vis[i]) continue;if (((res >> i) & 1) ^ ((x >> i) & 1)) res ^= bas[i];}return res == x;}
} A, B;void calc()
{B.init(tot - 1);for (int i = 0; i <= A.n; i++){if (!A.vis[i]) continue;ull x = 0;for (int j = 1; j <= tot; j++)x |= ((A.bas[i] >> bi[j]) & 1) << j - 1;B.ins(x);}if (!B.check((1 << tot) - 1)) return;int cnt = 0, w = k;for (int i = 0; i <= B.n; i++) if (B.vis[i]) cnt--;for (int i = 1; i <= tot; i++) cnt += bi[i] * cc[i];point5 delta = (point5) {1, 0};for (int i = 1; i <= tot; i++)delta.num *= C[w][cc[i]], w -= cc[i];if (cnt > 0) for (int i = 1; i <= cnt; i++) delta.num <<= 1;else for (int i = 1; i <= -cnt; i++){if (delta.num & 1) delta.is = 1;delta.num >>= 1;}ans = ans + delta;
}void dfs(int dep, int sum)
{if (dep == A.n + 1){if (sum == k) calc();return;}for (int i = 0; i <= k - sum; i++){if (i) bi[++tot] = dep, cc[tot] = i;dfs(dep + 1, sum + i);if (i) tot--;}
}int main()
{std::cin >> n >> k;for (int i = 1; i <= n; i++){a[i] = read();for (int j = 0; j <= 63; j++)if ((a[i] >> j) & 1) A.n = Max(A.n, j);}for (int i = 1; i <= n; i++) A.ins(a[i]);for (int i = 0; i <= k; i++) C[i][0] = 1;for (int i = 1; i <= k; i++)for (int j = 1; j <= i; j++)C[i][j] = C[i - 1][j] + C[i - 1][j - 1];dfs(0, 0);std::cout << ans.num;if (ans.is) std::cout << ".5";std::cout << std::endl;return 0;
}

[BZOJ3811][UOJ#36][清华集训2014]玛里苟斯(期望 + 线性基)相关推荐

  1. 清华集训2014 玛里苟斯

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

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

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

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

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

  4. 【清华集训 2014】玛里苟斯(组合计数 + 线性基)

    题目链接:[清华集训 2014]玛里苟斯 推荐博客:[BZOJ 3811]玛里苟斯:线性基(详细证明) 首先想到将kkk分类讨论. k=1" role="presentation& ...

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

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

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

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

  7. 【BZOJ3811】玛里苟斯(线性基)

    [BZOJ3811]玛里苟斯(线性基) 题面 BZOJ 题解 \(K=1\)很容易吧,拆位考虑贡献,所有存在的位出现的概率都是\(0.5\),所以答案就是所有数或起来的结果除二. \(K=2\)的情况 ...

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

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

  9. 【清华集训2014】【BZOJ3811】玛里苟斯

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

最新文章

  1. C++之typedef 小记
  2. geohash vs PostGIS
  3. html导航栏重叠怎么办,请问前端大神,html如何引入另一个html,写了一个导航栏想在多个页面中如何重复使用?...
  4. html5 历史管理
  5. Android SQLite调试
  6. 转载:逻辑思维提升表达
  7. C# EntityFramework连接Sqlite (Database First)
  8. 【java】java 局部变量表中的槽是可以重用的
  9. Comet OJ - Contest #11 题解赛后总结
  10. 三元运算符最终结果的数据类型
  11. 英语测试听力材料软件,英语听力软件哪个好?来这里!
  12. linux终端vi怎么输入日历,Remind: 命令行的 calendar 及 todo list
  13. 根据具体地址计算经纬度
  14. 小程序源码:全新实用工具证件照制作-多玩法安装简单
  15. 高级事件----笔记
  16. 我平常用计算机玩游戏英语,桌面游戏用英语怎么说
  17. Win10卸载OneDrive的方法
  18. ​嘉楠往事:浮沉八载,如今剑指美股
  19. Android 调用系统打开相机,打开相册获取图片路径
  20. UIPATH 数据提取

热门文章

  1. 游戏网站的设计与实现(HTML和CSS实现魔兽世界官网)
  2. BI低代码数字化应用搭建平台
  3. 多用户服务器程序设计(详解)
  4. 如何在计算机里查找pdf文件,电脑上怎么打开PDF文件 你值得一看的技巧
  5. 第四章利用恶意软件网络识别攻击活动(下)
  6. 22个提升生产力的工具推荐,稳了
  7. 中小型企业HR如何做培训计划?
  8. Drupal7 相关资料
  9. 新年伊始勿忘给保险做个“年检”
  10. 大端字节序码流中取出2字节_字节码忍者的秘密