大力观察: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. HTML 常见的 DOCTYPE 声明

    <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关 ...

  2. lintcode373 奇偶分割数组

    奇偶分割数组 分割一个整数数组,使得奇数在前偶数在后. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]. 我的方法:设定两个数组,分别 ...

  3. Scala学习笔记之Actor多线程与线程通信的简单例子

    题目:通过子线程读取每个文件,并统计单词数,将单词数返回给主线程相加得出总单词数 package review import scala.actors.{Actor, Future} import s ...

  4. kafka stream 低级别的Processor API动态生成拓扑图

    public class KafkaSream { public static void main(String[] args) { Map<String, Object> props = ...

  5. 使用truffle测试部署合约

    truffle console let contract; contract=BloggerCoin.deployed().then(instance=>contract=instanc e);

  6. vue开发学习中遇到的问题以及解决方法

    1:node-sass 安装失败,可使用 cnpm 安装 npm install cnpm -g --registry=https://registry.npm.taobao.org cnpm -v ...

  7. 第一次接触FPGA至今,总结的宝贵经验

    从大学时代第一次接触FPGA至今已有10多年的时间,至今记得当初第一次在EDA实验平台上完成数字秒表.抢答器.密码锁等实验时那个兴奋劲.当时由于没有接触到HDL硬件描述语言,设计都是在MAX+plus ...

  8. android平台蓝牙编程(转)

    http://blog.csdn.net/pwei007/article/details/6015907 Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输. 本文档描述了怎样利用a ...

  9. c++ int 负数 补码 隐式类型转换

    unsigned y = ; ; cout << x + y << endl; 对于上述的结果为 这里面有一个负数的补码问题和不同类型之间的隐式类型转换问题 首先负数的表示方法 ...

  10. Delphi中Self和Sender的区别

    在事件处理程序参数表中,至少含有一个参数Sender,它代表触发事件处理程序的构件,如在上例中,Sender就指Button2,有了Sender参数,可以使多个构件共用相同的事件处理程序,如下例:   ...