大力观察: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+线性基的更多相关文章

  1. 【BZOJ 3652】大新闻 数位dp+期望概率dp

    并不难,只是和期望概率dp结合了一下.稍作推断就可以发现加密与不加密是两个互相独立的问题,这个时候我们分开算就好了.对于加密,我们按位统计和就好了;对于不加密,我们先假设所有数都找到了他能找到的最好的 ...

  2. HDU 3853 期望概率DP

    期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] ,  右移:[x][y ...

  3. 【NOIP模拟赛】黑红树 期望概率dp

    这是一道比较水的期望概率dp但是考场想歪了.......我们可以发现奇数一定是不能掉下来的,因为若奇数掉下来那么上一次偶数一定不会好好待着,那么我们考虑,一个点掉下来一定是有h/2-1个红(黑),h/ ...

  4. BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp

    首先这道题让我回忆了一下最短路算法,所以我在此做一个总结: 带权: Floyed:O(n3) SPFA:O(n+m),这是平均复杂度实际上为O(玄学) Dijkstra:O(n+2m),堆优化以后 因 ...

  5. 期望概率DP

    期望概率DP 1419: Red is good ​ Description ​ 桌面上有\(R\)张红牌和\(B\)张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付 ...

  6. bzoj 3811: 玛里苟斯【线性基+期望dp】

    这个输出可是有点恶心啊--WA*inf,最后抄了别人的输出方法orz 还有注意会爆long long,要开unsigned long long 对于k==1,单独考虑每一位i,如果这一位为1则有0.5 ...

  7. 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学

    神™题........ 这道题的提示......(用本苣蒻并不会的积分积出来的)并没有 没有什么卵用 ,所以你发现没有那个东西并不会 不影响你做题 ,然后你就可以推断出来你要求的是我们最晚挑到第几大的 ...

  8. bzoj 3811: 玛里苟斯

    3811: 玛里苟斯 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 190  Solved: 95[Submit][Status][Discuss] ...

  9. BZOJ.3811.玛里苟斯(线性基)

    BZOJ UOJ 感觉网上大部分题解对我这种数学基础差的人来说十分不友好...(虽然理解后也觉得没有那么难) 结合两篇写的比较好的详细写一写.如果有错要指出啊QAQ https://blog.csdn ...

随机推荐

  1. web漏洞原理 (需要每周更新此篇文章)

    SQL注入攻击简介 结构化查询语言SQL是用来和关系数据库进行交互的文本语言.它允许用户对数据进行有效的管理,包含了对数据的查询.操作.定义和控制等几个方面,例如向数据库写入.插入数据,从数据库读取数 ...

  2. C++ 基础面试题-2

    请写出一下程序的输出内容 /* ** 2018/03/21 22:02:03 ** Brief: ** Author:ZhangJianWei ** Email:Dream_Dog@163.com * ...

  3. 阿里云ECS下Ubuntu 16.04系统安装python3.6.5 环境并设置为默认

    一.添加python3.6安装包并安装: 二.修改系统默认python版本为3.6: 三.安装并升级pip版本: 一.添加python3.6安装包并安装: sudo apt-get install s ...

  4. unity中虚拟摇杆的实现

    实现效果: 实现: 使用NGUI添加虚拟摇杆背景和其子物体按钮,为按钮Attach  boxcollider和ButtionScript.为按钮添加如下脚本: 注意:其中的静态属性可以在控制物体移动的 ...

  5. 只写Python一遍代码,就可以同时生成安卓及IOS的APP,真优秀

    前言: 用Python写安卓APP肯定不是最好的选择,但是肯定是一个很偷懒的选择 我们使用kivy开发安卓APP,Kivy是一套专门用于跨平台快速应用开发的开源框架,使用Python和Cython编写 ...

  6. AVL树和伸展树 -数据结构(C语言实现)

    读数据结构与算法分析 AVL树 带有平衡条件的二叉树,通常要求每颗树的左右子树深度差<=1 可以将破坏平衡的插入操作分为四种,最后通过旋转恢复平衡 破坏平衡的插入方式 描述 恢复平衡旋转方式 L ...

  7. smartgit 使用

    合并分支

  8. nginx 应用篇

    nginx 信号控制(commanLine) kill singel  pid ps aux|grep nginx nginx 有两个进程,一个 master 一个worker 一个master管理一 ...

  9. solidity 十六进制字符串转十六进制bytes

    pragma solidity ^0.4.16; contract Metadata { // 十六进制字符串转换成bytes function hexStr2bytes(string data)re ...

  10. nordic mesh中的消息缓存实现

    nordic mesh中的消息缓存实现 代码文件msg_cache.h.msg_cache.c. 接口定义 头文件中定义了四个接口,供mesh协议栈调用,四个接口如下所示,接口的实现代码在msg_ca ...