【BZOJ3811/UOJ36】 玛里苟斯
Description
Input
Output
Sample Input
0
1
2
3
Sample Output
HINT
Source
Solution
被学长安利去做这道题。。。线性基。
考虑一个性质:如果把集合内的一个数异或上另一个数,则这个集合的子集的异或和的集合不变。
什么叫做子集的异或和的集合?就是你从一个集合中选出一个子集,这个有2^n种选法,把选出来的数异或起来,然后这些异或起来的数组成的集合。
考虑证明:
假如我们一开始的集合是{a,b,...},我们把b异或上a,得到{a,a^b,...}。
然后原来和b有关但与a无关的子集的异或和,我们可以用a异或上a^b来代替;
原来和a和b都有关的子集的异或和,我们现在可以直接用a^b来代替。
其他的集合因为没有变,所以还是不变的。
那么总共产生的集合还是没有变。
既然我们有这么一个操作,那么我们就可以按位高斯消元了。我们把原集合高斯消元后得到的集合称作线性基(听别人说好像也叫秩?我对线代一无所知,所以不是很懂)。
可以证明线性基的个数是log权值的。
这题就是把式子展开完dfs一下。。。(你要是愿意每个子任务写k个for也是可以的)
Code
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath> #ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif #ifdef CT
#define debug(...) printf(__VA_ARGS__)
#define setfile()
#else
#define debug(...)
#define filename ""
#define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout)
#endif #define R register
#define getc() (_S == _T && (_T = (_S = _B) + fread(_B, 1, 1 << 15, stdin), _S == _T) ? EOF : *_S++)
#define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
#define cabs(_x) ((_x) < 0 ? (- (_x)) : (_x))
char _B[ << ], *_S = _B, *_T = _B;
typedef unsigned long long ull;
inline ull F()
{
R char ch; R ull cnt = ; R bool minus = ;
while (ch = getc(), (ch < '' || ch > '') && ch != '-') ;
ch == '-' ? minus = : cnt = ch - '';
while (ch = getc(), ch >= '' && ch <= '') cnt = cnt * + ch - '';
return minus ? -cnt : cnt;
}
typedef long long ll;
ull b[], c[];
int top, m, sum, n, k, tmp, sn[], maxlen;
ll ans;
bool flag;
void dfs(R int step, R ull state)
{
if (!step)
{
R int cnt = ;
memset(c, , (m + ) << );
for (R int i = ; i <= m; ++i)
{
R ull x = b[i] & state;
for (; x; )
{
tmp = __builtin_ctzll(x);
if (!c[tmp])
{
c[tmp] = x;
break;
}
x ^= c[tmp];
}
}
for (R int i = m; i >= ; --i)
if (c[i])
for (R int j = i - ; j >= ; --j)
if (c[j] & (1ull << i))
c[j] ^= c[i];
R ull summ = ;
for (R int i = ; i <= m; ++i) if (c[i]) ++cnt, summ ^= c[i];
if (summ != state) return ;
// printf("%d %d\n", cnt, sum );
if (sum < cnt)
{
++sn[cnt - sum];
cmax(maxlen, cnt - sum);
}
else ans += 1ull << (sum - cnt);
return ;
}
for (R int i = ; i <= m; ++i)
{
sum += i;
dfs(step - , state | (1ull << i));
sum -= i;
}
}
int main()
{
// setfile();
n = F(), k = F();
for (R int i = ; i <= n; ++i)
{
R ull x = F();
cmax(m, - __builtin_clzll(x));
for (; x; )
{
tmp = __builtin_ctzll(x);
if (!b[tmp])
{
b[tmp] = x;
break;
}
x ^= b[tmp];
}
}
for (R int i = m; i >= ; --i)
if (b[i])
for (R int j = i - ; j >= ; --j)
if (b[j] & (1ull << i))
b[j] ^= b[i];
// for (R int i = 0; i <= m; ++i) printf("%llu ", b[i] );
dfs(k, );
for (R int i = maxlen; i; --i)
{
sn[i - ] += sn[i] >> ;
sn[i] %= ;
}
ans += sn[];
printf("%llu", ans );
sn[] ? puts(".5") : ;
return ;
}
【BZOJ3811/UOJ36】 玛里苟斯的更多相关文章
- bzoj3811 uoj36 玛里苟斯
做题前问了一下miaom,得到了一个奇怪的回答 mmp 这题分类讨论 k=1sb题 k=2按位计算,把每个数看成几个2的幂次的和,按位跑期望 k>2线性基sb题 没了 #include<i ...
- 【BZOJ3811】玛里苟斯(线性基)
[BZOJ3811]玛里苟斯(线性基) 题面 BZOJ 题解 \(K=1\)很容易吧,拆位考虑贡献,所有存在的位出现的概率都是\(0.5\),所以答案就是所有数或起来的结果除二. \(K=2\)的情况 ...
- #YCB#待做题目与填坑资料
各种填坑资料(qwq) 主席树(by YL)戳 树套树(by ZSY)戳 不要问我这些题咋来的(查大佬的水表呗) 题目列表: [HDU5977]Garden of Eden [BZOJ2752][HA ...
- 【bzoj3811】【清华集训2014】玛里苟斯
3811: 玛里苟斯 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 500 Solved: 196[Submit][Status][Discuss] ...
- BZOJ3811 玛里苟斯(线性基+概率期望)
k=1的话非常好做,每个有1的位都有一半可能性提供贡献.由组合数的一些性质非常容易证明. k=2的话,平方的式子展开可以发现要计算的是每一对位提供的贡献,于是需要计算每一对位被同时选中的概率.找出所有 ...
- bzoj3811 玛里苟斯
分三种情况讨论 k=1时,对于每一位而言,只要有一个数这一位是1,那么这个就有0.5的概率是1,选他就是1,不选就是0,有第二个的话,在第一个选或不选的前提下,也各有0.5的几率选或不选,0和1的概率 ...
- UOJ#36. 【清华集训2014】玛里苟斯 线性基
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ36.html 题解 按照 $k$ 分类讨论: k=1 : 我们考虑每一位的贡献.若有至少一个数第 $i$ ...
- bzoj 3811: 玛里苟斯
3811: 玛里苟斯 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 190 Solved: 95[Submit][Status][Discuss] ...
- uoj 36 玛里苟斯
[清华集训2014]玛里苟斯 - 题目 - Universal Online Judge k=1,2,3,4,5各占20pts是提示 应当分开考虑 k=1 拆位,如果第i位有1,则有1/2的概率xor ...
随机推荐
- 向tabcontrol中添加form
昨天花了一天的时间去找一个错误,关系是这样的,我添加一个tabcontrol就叫tc1好了,然后在tc1中再动态添加一个父窗体l叫form1,要把form1添加进tabcontrol就要先新建一个ta ...
- HDU 1160 FatMouse's Speed (动态规划、最长下降子序列)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Websocket --(3)实现
今天介绍另外一种websocket实现方式,结合了spring MVC,并完善了第二节所提到做一个简单的登录认证用来识别用户的名称.界面继续沿用第二节的布局样式,同时增加上线和下线功能. 参考了 ht ...
- 网页嵌入pdf、在线预览pdf工具及插件(转)
摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如下: 代码片段1: 1 <object ty ...
- php 图像处理 抠图,生成背景透明png 图片
*自定义一个图片等比缩放函数 *@param string $picname 被缩放图片名 *@param string $path 被缩放图片路径 *@param int $maxWidth 图片被 ...
- Jquery复习(三)之链式调用
通过 jQuery,可以把动作/方法链接在一起. Chaining 允许我们在一条语句中运行多个 jQuery 方法(在相同的元素上). jQuery 方法链接 直到现在,我们都是一次写一条 jQue ...
- 一键安装cobbler脚本
#!/bin/bash # # Install Cobbler(Kickstart) Tools / # Created by OceanHo(gzhehai@foxmail.com) AT -- # ...
- DSP学习资料:基于6U VPX的 XC7VX690T+C6678的双FMC接口雷达通信处理板
基于6U VPX的 XC7VX690T+C6678的双FMC接口雷达通信处理板 一.板卡概述 高性能VPX信号处理板基于标准6U VPX架构,提供两个标准FMC插槽,适用于电子对抗或雷达信号等领域 ...
- 总结下Nginx的功能模块
nginx-1.10.3]# ./configure \ --prefix=/usr/local/nginx \ #指定安装路径 --user=nginx --group=ngin ...
- linux 走三层内网添加静态路由
/etc/sysconfig/network-scripts/ifcfg-eth1 #机器1ip route add 10.24.4.0/24 via 10.90.203.1 dev ens33/et ...