【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基
大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了
期望概率dp:对于k=1的时候,把所有存在的位乘0.5就行了,对于k=2的时候就可以用类似推反演的方法(转换枚举顺序之类的)退出来一个式子,然后你只需要求个概率(很好推,也很好求)就可以啦
线性基:搜索之前还有dp之前预处理用的(只是构造一下)
然而我的做法却是,先求出线性基,再用期望概率dp(类似OSU!那种).所以呢,我先被卡了几次精,后来有了zyf的提示,我才把double换成unsigned long long.之后又是一直wa,然后我发现,对于线性基,即使进行了向上消的操作(这个操作还不是很熟额),每一位也会有多个基为1.发现自己十分native......之后就懵逼了......又经过思考我把所有存在的位出现的概率都看作是0.5,并且相互独立,然后得到了76分,十分开心,我以为找到了正确的方向......结果最后发现,位与位之间的概率并不独立......但是这个东西在k=1的时候显然没用影响,在k>1的时候会有影响,但是k=2的时候,可以从正解的式子看出,造成的影响可以在你合并了所有在基上分布相同的位之后被消除,然而k>2的时候就复杂得多(至少我没想出来我的dp怎么继续做......)......所以最后还是特判了k>2的点用搜索跑过了......
从一开始我就由于没有观察题目性质和对线性基的误导把思路放到神奇的期望概率dp上,最后卡了很久,所以说我对线性基的理解和画柿子的思路以及对期望概率里样本空间的理解(或者说对独立事件的理解)还是很native(当然还有大力观察的能力)
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef unsigned long long LL;
char xB[(<<)+],*xS=xB,*xT=xB;
#define gtc (xS==xT&&(xT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xT)?0:*xS++)
inline void read(int &x){
register char ch=gtc;
for(x=;ch<''||ch>'';ch=gtc);
for(;ch>=''&&ch<='';x=(x<<)+(x<<)+ch-'',ch=gtc);
}
inline void Read(LL &x){
register char ch=gtc;
for(x=;ch<''||ch>'';ch=gtc);
for(;ch>=''&&ch<='';x=(x<<)+(x<<)+ch-'',ch=gtc);
}
int n,k,m,sum,cnt;
LL x[],c[][],pf[],gay[],temp,st[],get,tot,val[];
bool die[];
#define bin(a,b) (((a)>>(b))&1)
inline LL pick(LL key){
LL ret=key;
for(int i=;i<k;++i)ret*=key;
return ret;
}
inline void dfs(int pos,LL have){
if(pos==m+)return void(tot+=pick(have));
dfs(pos+,have),dfs(pos+,have^val[pos]);
}
int main(){
register int i,j;int l;
for(read(n),read(k),i=;i<=n;++i){
Read(temp);
for(j=;j>=;--j){
if(!bin(temp,j))continue;
if(gay[j])temp^=gay[j];
else{gay[j]=temp,++m;break;}
}
}
for(i=;i>=;--i){
if(!gay[i])continue;
for(j=i+;j<=;++j)
if(bin(gay[j],i))
gay[j]^=gay[i];
}
for(i=;i<=;++i)
for(j=i;j<=;++j)
if(bin(gay[j],i))
st[i]|=((LL))<<j;
for(i=;i<=;++i)
if(gay[i]==&&st[i])++sum;
if(k>&&sum&&m<){
for(i=;i<=;++i)
if(gay[i])
val[++cnt]=gay[i];
dfs(,),tot>>=m-;
long long tmp=tot>>;
if(tot&)printf("%lld",tmp),puts(".5");
else printf("%lld\n",tmp);
return ;
}
c[][]=;
for(i=;i<=k;++i){
c[i][]=;
for(j=;j<=i;++j)
c[i][j]=c[i-][j-]+c[i-][j];
}
x[]=;
for(i=;i<=;++i){
temp=;
for(j=;j<=;++j)
if(bin(gay[j],i)){temp=;break;}
if(!temp)continue;
temp=((LL))<<i;
pf[]=;
for(j=;j<=k;++j)pf[j]=pf[j-]*temp;
for(j=k;j>;--j)
for(l=;l<=j;++l)
if(x[j-l]&)
x[j]+=x[j-l]*((c[j][l]&)?(pf[l]>>)*c[j][l]:(c[j][l]>>)*pf[l]);
else x[j]+=(x[j-l]>>)*c[j][l]*pf[l];
}
long long tmp=x[k]>>;
if(x[k]&)printf("%lld",tmp),puts(".5");
else printf("%lld\n",tmp);
return ;
}
【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基的更多相关文章
- 【BZOJ 3652】大新闻 数位dp+期望概率dp
并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的 ...
- HDU 3853 期望概率DP
期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] , 右移:[x][y ...
- 【NOIP模拟赛】黑红树 期望概率dp
这是一道比较水的期望概率dp但是考场想歪了.......我们可以发现奇数一定是不能掉下来的,因为若奇数掉下来那么上一次偶数一定不会好好待着,那么我们考虑,一个点掉下来一定是有h/2-1个红(黑),h/ ...
- BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp
首先这道题让我回忆了一下最短路算法,所以我在此做一个总结: 带权: Floyed:O(n3) SPFA:O(n+m),这是平均复杂度实际上为O(玄学) Dijkstra:O(n+2m),堆优化以后 因 ...
- 期望概率DP
期望概率DP 1419: Red is good Description 桌面上有\(R\)张红牌和\(B\)张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付 ...
- bzoj 3811: 玛里苟斯【线性基+期望dp】
这个输出可是有点恶心啊--WA*inf,最后抄了别人的输出方法orz 还有注意会爆long long,要开unsigned long long 对于k==1,单独考虑每一位i,如果这一位为1则有0.5 ...
- 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学
神™题........ 这道题的提示......(用本苣蒻并不会的积分积出来的)并没有 没有什么卵用 ,所以你发现没有那个东西并不会 不影响你做题 ,然后你就可以推断出来你要求的是我们最晚挑到第几大的 ...
- bzoj 3811: 玛里苟斯
3811: 玛里苟斯 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 190 Solved: 95[Submit][Status][Discuss] ...
- BZOJ.3811.玛里苟斯(线性基)
BZOJ UOJ 感觉网上大部分题解对我这种数学基础差的人来说十分不友好...(虽然理解后也觉得没有那么难) 结合两篇写的比较好的详细写一写.如果有错要指出啊QAQ https://blog.csdn ...
随机推荐
- MySQL连接本地数据库时报1045错误的解决方法
navicat for MySQL 连接本地数据库出现1045错误 如下图: 说明连接mysql时数据库密码错误,需要修改密码后才可解决问题: 解决步骤如下: .首先打开命令行:开始->运行 ...
- Charles使用及mock数据
1.下载charles 3.9.2[破解版地址:https://download.csdn.net/my] 下方有一种方法可破解4.2以前的版本 // Charles Proxy License // ...
- jmeter基础之录制篇
一.前言 jmeter如今被越来越多人喜爱的一款测试工具,相比于loadrunner它体积特轻便.jmeter不仅用来做单接口测试,压测还能做性能,主要是一款开源的,可以写一个你需要的插件功能再添加里 ...
- 平衡的括号 (Parentheses Balance UVA - 673)
题目描述: 原题:https://vjudge.net/problem/UVA-673 题目思路: 1.水题 2.栈+模拟 3.坑在有空串 AC代码 #include <iostream> ...
- Idea Live Templates
常用live templates 模板 注释 : * * @param $params$ * @return $return$ * $date$ $time$ chiyuanzhen743 */ lo ...
- ajax 和 mock 数据
ajax ajax是一种技术方案,但并不是一种新技术.它依赖的是现有的CSS/HTML/Javascript,而其中最核心的依赖是浏览器提供的XMLHttpRequest对象,是这个对象使得浏览器可以 ...
- Dictionary tabPage使用
public override bool AccptChange() { //if (oldvalue == null || oldvalue.Count <= 0) //{ // return ...
- Hadoop源码解析 1 --- Hadoop工程包架构解析
1 Hadoop中各工程包依赖简述 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster: http:// ...
- javaScript中两个等于号和三个等于号之间的区别
一言以蔽之:==先转换类型再比较,===先判断类型,如果不是同一类型直接为false. ===表示恒等于,比较的两边要绝对的相同 alert(0 == ""); // trueal ...
- [C++] in-class initializer
C++11 introduced serveral contructor-related enhancements including: Class member initializers Deleg ...