bzoj 3811: 玛里苟斯【线性基+期望dp】
这个输出可是有点恶心啊……WA*inf,最后抄了别人的输出方法orz
还有注意会爆long long,要开unsigned long long
对于k1,单独考虑每一位i,如果这一位为1则有0.5的概率贡献1<<i,否则没有贡献,因为这一位选了奇数偶数个1的概率是一样的
对于k2,考虑乘法的意义,也就是i位和j位同时为1的概率p,贡献(1<<(i+j))*p,这个p,如果全部的a[k]都是在i位和j为相同则是p=0.5(因为这样一来ij的值就关联了),否则p=0.25
对于剩下的,建线性基后最多有21个元素,直接枚举所有状态即可
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=100005;
unsigned long long n,m,k,a[N],b[65],tot,ans,res;
unsigned long long read()
{
unsigned long long r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void ins(unsigned long long x)
{
for(int i=63;i>=0;i--)
if(x>>i)
{
if(!b[i])
{
b[i]=x;
return;
}
x^=b[i];
}
}
int main()
{
n=read(),k=read();
for(int i=1;i<=n;i++)
a[i]=read();
if(k==1)
{
for(int i=1;i<=n;i++)
ans|=a[i];
printf("%llu",ans>>1),puts((ans&1)?".5":"");
return 0;
}
if(k==2)
{
unsigned s=0;
for(int i=1;i<=n;i++)
s|=a[i];
for(int i=0;i<32;i++)
for(int j=0,fl=0;j<32;++j,fl=0)
if((s>>i&1)&&(s>>j&1))
{
for(int k=1;k<=n;k++)
if((a[k]>>i&1)^(a[k]>>j&1))
{
fl=1;
break;
}
if(i+j-1-fl<0)
++res;
else ans+=1llu<<(i+j-1-fl);
}
ans+=res>>1;
printf("%llu",ans),puts((res&1)?".5":"");
return 0;
}
unsigned long long ans=0;
for(int i=1;i<=n;i++)
ins(a[i]);
// for(int i=0;i<=20;i++)
// cerr<<b[i]<<" ";cerr<<endl;
for(m=22;!b[m];m--);
m++;
for(int s=0,len=(1<<m);s<len;s++)
{
unsigned long long sm=0,r=1;
for(int i=0;i<m;i++)
if(s&(1<<i))
sm^=b[i];
for(int i=1;i<k;i++)
r*=sm;
if(r<len)
{
r*=sm,tot+=r;
if(tot>=len)
ans+=tot/len,tot%=len;
}
else
{
ans+=r/len*sm,r%=len,r*=sm,tot+=r;
if(tot>=len)
ans+=tot/len,tot%=len;
}
}
printf("%llu",ans),puts(tot?".5":"");
return 0;
}
bzoj 3811: 玛里苟斯【线性基+期望dp】的更多相关文章
- BZOJ.3811.玛里苟斯(线性基)
BZOJ UOJ 感觉网上大部分题解对我这种数学基础差的人来说十分不友好...(虽然理解后也觉得没有那么难) 结合两篇写的比较好的详细写一写.如果有错要指出啊QAQ https://blog.csdn ...
- 【做题】CF388D. Fox and Perfect Sets——线性基&数位dp
原文链接https://www.cnblogs.com/cly-none/p/9711279.html 题意:求有多少个非空集合\(S \subset N\)满足,\(\forall a,b \in ...
- BZOJ CF388D. Fox and Perfect Sets [线性基 数位DP]
CF388D. Fox and Perfect Sets 题意:求最大元素\(le n\)的线性空间的个数 给神题跪了 orz 容易想到 每个线性基对应唯一的线性空间,我们可以统计满足条件的对应空间不 ...
- bzoj 3811: 玛里苟斯
3811: 玛里苟斯 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 190 Solved: 95[Submit][Status][Discuss] ...
- UOJ#36. 【清华集训2014】玛里苟斯 线性基
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ36.html 题解 按照 $k$ 分类讨论: k=1 : 我们考虑每一位的贡献.若有至少一个数第 $i$ ...
- bzoj 2115 Xor - 线性基 - 贪心
题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 问点$1$到点$n$的最大异或路径. 因为重复走一条边后,它的贡献会被消去.所以这条路径中有贡献的边可以看成是一条$1$到 ...
- 【BZOJ】2134: 单选错位 期望DP
[题意]有n道题,第i道题有ai个选项.把第i道题的正确答案填到第i+1道题上(n填到1),问期望做对几道题.n<=10^7. [算法]期望DP [题解]正确答案的随机分布不受某道题填到后面是否 ...
- Codeforces 1299D - Around the World(线性基+图论+dp)
Codeforces 题目传送门 & 洛谷题目传送门 一道线性基的综合题 %%%%%% 首先注意到"非简单路径""异或和"等字眼,可以本能地想到线性基. ...
- [清华集训2015 Day1]玛里苟斯-[线性基]
Description Solution 考虑k=1的情况.假设所有数中,第i位为1的数的个数为x,则最后所有的子集异或结果中,第i位为1的个数为$(C_{k}^{1}+C_{k}^{3}+...)$ ...
随机推荐
- Go与C语言的互操作 cgo
http://tonybai.com/2012/09/26/interoperability-between-go-and-c/ // foo.h int count; void foo(); //f ...
- 关于使用openfiler作为共享存储来安装rac时的问题
关于使用openfiler作为共享存储来安装rac时的问题 第一:一定要使用openfiler-2.3-x86-disc1.iso这个版本号的openfiler,不要使用其它版本号的openfiler ...
- Redis相关知识
Redis 存储的五种 字符串类型:string 一个String类型的value最大可以存储512M String是最常用的一种数据类型,普通的key/value存储. 散列类型: hash 键值 ...
- (testng多个class文件执行时混乱,不是等一个class内的所有methods执行完再去执行下一个class内的内容)问题的解决
问题描述如下: We use TestNG and Selenium WebDriver to test our web application. Now our problem is that we ...
- 利用ctypes调用Fortran程序
本来python下面调用fortran最傻瓜方便的办法就是f2py,但是若fortran和C混合编程的代码,分别指定gfortran和gcc为编译器,在windows下面f2py直接报错 那么ctyp ...
- iOS面试常见题
1.耶稣有13个门徒,当中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13个人围坐一圈,从第一个人開始循环报数,数到三排除,最后剩下的人就是叛徒 int people[13] = {1,2,3, ...
- JAVA学习第十九课(java程序的异常处理 (二))
异常处理的捕捉形式: 这是能够对异常进行针对性处理的方式 六.try.catch的理解 详细格式: try { //须要被检測异常的代码 } catch(异常类 变量)//改变量用于接受发生异常的对象 ...
- Django 之 form表单
Django中的Form表单 1.背景 平时我们在书写form表单时,经常都是手动的去写一些input标签,让用户输入一些功能,进行一些校验的判断,等等.Django中的form表单就能够帮我们去实现 ...
- JS中的存储机制
一.堆和栈的介绍 1.堆和队,是先进先出:栈,是先进后出,就跟水桶差不多: 2.存储速度:堆和队的存储速度较慢,栈的存储速度较快,会自动释放: 二.js中存储的类型 1.堆,一般用于复杂数据类型,存储 ...
- linux内核的三种主要调度策略
linux内核的三种主要调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务 3,SCHED_RR实时调度策略,时间片轮转 实时进程将得到优先调用, ...