大力观察: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. APP功能性测试-2

    安装与卸载 应用是否可以在不同的安卓版本上安装(过低不能适配) 安装后是否可以正常运行 安装空间不足时是否有相应提示 如果应用需要通过网络验证之类的安装,需要测试一下断网情况下是否有相应提示 安装过程 ...

  2. Java开发工程师(Web方向) - 02.Servlet技术 - 第1章.Servlet

    第1章--Servlet Servlet简介 Servlet应用于? 浏览器发出HTTP请求,服务器接收请求后返回响应给浏览器. 接收请求后到返回响应之间: 服务器将请求对象转交给Servlet容器 ...

  3. Leetcode-跳跃游戏

    跳跃游戏     给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] ...

  4. Mybatis generator自动生成mybatis配置和类信息

    自动生成代码方式两种: 1.命令形式生成代码,详细讲解每一个配置参数. 2.Eclipse利用插件形式生成代码. 安装插件方式: eclipse插件安装地址:http://mybatis.google ...

  5. 事后分析报告(M2阶段)

    我们的项目是自选项目,一款名为备忘录锁屏MemoryDebris的软件. 在第二轮的迭代中,由于各科的大作业都集中在这一段时间,所以这段时间各个组员间的负担都比较大,但是在大家共同努力,最终我们还是交 ...

  6. About Dynamic Programming

    Main Point: Dynamic Programming = Divide + Remember + Guess 1. Divide the key is to find the subprob ...

  7. 2019寒假训练营寒假作业(二) MOOC的网络空间安全概论笔记部分

    视频课程--MOOC的网络空间安全概论笔记 第一章 网络空间安全概述 2001年,网络空间概念被首次提出: 网络空间安全框架: 1.设备层安全: 可通过截获电磁辐射获取计算机信息.通过硬件木马(恶意电 ...

  8. 软工网络15团队作业4——Alpha阶段敏捷冲刺-2

    一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 微信公众号平台注册"小程序"的账号; 下载微信官方的小程序开发工具,这个是编辑小程序和上传审核小程序必须的工具; 大家一 ...

  9. 线程同步(使用了synchronized)和线程通讯(使用了wait,notify)

    线程同步 什么是线程同步? 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题. 实现同步机制有两个方法:1.同 ...

  10. Java中关于 ArrayList 和 Map 的常用遍历方法 (学习笔记,便于以后查询)

    一.学习ArrayList与Map时,关于常用遍历方法的记录如下:  二.附源码如下: package com.study.in.myself; import java.util.ArrayList; ...