题意:给出n个点和m条边,每条边有权值wi,从1出发,每次等概率选一条出边走,直到终点n停止,得到的值是路径所有边的异或和。问异或和期望。

解法:这道题非常有意思!首先比较直观的想法就是dp[x]代表x走到终点n的期望异或和。那么容易写出状态转移方程dp[x]=sigma(dp[y]^w)/du[x] (y是x出点,w是出边权值)。虽然有自环和环,但是我们可以用高斯消元解决。但是再仔细一看,有xor还有除法的方程怎么用高斯消元解。。。

于是我们又想到期望是有线性叠加性的E(x+y)=E(x)+E(y)。那么此题又涉及到位运算,于是我们按位考虑!

例如考虑二进制第k位,dp[x]代表x到终点n的异或和结果第k位为1的期望,因为此时只涉及到0和1了,于是我们就可以愉快地加减了。

dp[x]=( sigma(dp[y])+sigma(1-dp[y]) ) / du[x] 。前面一项代表边w的第k位为0于是我们要在y上找1的概率,后面一项代表边w的第k位为1于是我们就要在y找0的概率。

写出转移方程之后基本功扎实就很容易化简然后上高斯消元解方程了。

最后我们把各个位的贡献线性叠加即可。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=+;
const int M=1e4+;
const long double eps=1e-;
int n,m,du[N]; int cnt=,head[N],nxt[M<<],to[M<<],len[M<<];
void add_edge(int x,int y,int z) {
nxt[++cnt]=head[x]; to[cnt]=y; len[cnt]=z; head[x]=cnt;
} long double c[N][N],b[N];
void Gauss(int n,int m) { //变量个数 方程个数
int r=;
for (int i=;i<=n;i++) {
int j=r+;
while (j<=m && fabs(c[j][i])<eps) j++; //从下面方程找一个第i位不为0的
if (j==m+) continue; //不存在第i位不为0的方程
r++; //矩阵的秩
for (int k=;k<=n;k++) swap(c[r][k],c[j][k]); //存在第i位不为0的方程,交换上去
swap(b[r],b[j]); for (int j=;j<=m;j++) { //以r方程回代m个方程
if (r==j) continue;
long double rate=c[j][i]/c[r][i];
for (int k=i;k<=n;k++) c[j][k]-=c[r][k]*rate;
b[j]-=b[r]*rate;
}
}
for (int i=;i<=n;i++) b[i]=b[i]/c[i][i]; //唯一解求解
} int main()
{
cin>>n>>m;
for (int i=;i<=m;i++) {
int x,y,z; scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
if (x!=y) add_edge(y,x,z);
if (x==y) du[x]++; else du[x]++,du[y]++;
}
long double ans=;
for (int k=;k<;k++) {
memset(c,,sizeof(c));
memset(b,,sizeof(b));
for (int i=;i<n;i++) { //建立方程
for (int j=head[i];j;j=nxt[j]) {
int t=len[j];
if ((t&(<<k))==) {
c[i][to[j]]-=(long double)1.0/du[i];
} else {
c[i][to[j]]+=(long double)1.0/du[i];
b[i]+=(long double)1.0/du[i];
}
}
c[i][i]+=1.0;
}
c[n][n]=1.0;
Gauss(n,n);
ans+=b[]*(<<k);
}
printf("%.3Lf\n",ans);
return ;
}

BZOJ-2337 XOR和路径(HNOI2011)概率DP+概率的线性叠加的更多相关文章

  1. BZOJ 2337 XOR和路径 | 高斯消元 期望 位运算

    BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这 ...

  2. BZOJ 2337 XOR和路径(概率DP)

    求点1到点n经过的路径权值异或和的期望. 考虑按位计算,对于每一位来说,令dp[i]表示从i到n的异或和期望值. 那么dp[i]=sum(dp[j]+1-dp[k]).如果w(i,j)这一位为0,如果 ...

  3. BZOJ 2337 XOR和路径(高斯消元)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2337 题意:给定一个带权无向图.从1号点走到n号点.每次从当前点随机(等概率)选择一条相 ...

  4. BZOJ 2337: [HNOI2011]XOR和路径 [高斯消元 概率DP]

    2337: [HNOI2011]XOR和路径 题意:一个边权无向连通图,每次等概率走向相连的点,求1到n的边权期望异或和 这道题和之前做过的高斯消元解方程组DP的题目不一样的是要求期望异或和,期望之间 ...

  5. 洛谷P3211 [HNOI2011]XOR和路径(期望dp+高斯消元)

    传送门 高斯消元还是一如既往的难打……板子都背不来……Kelin大佬太强啦 不知道大佬们是怎么发现可以按位考虑贡献,求出每一位是$1$的概率 然后设$f[u]$表示$u->n$的路径上这一位为$ ...

  6. BZOJ 1415: [Noi2005]聪聪和可可 [DP 概率]

    传送门 题意:小兔子乖乖~~~ 题意·真:无向图吗,聪抓可,每个时间聪先走可后走,聪一次可以走两步,朝着里可最近且点编号最小的方向:可一次只一步,等概率走向相邻的点或不走 求聪抓住可的期望时间 和游走 ...

  7. [NOIP2016 D1T3]换教室 【floyd+概率dp】

    题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...

  8. HDU 4576 Robot(概率dp)

    题目 /*********************复制来的大致题意********************** 有N个数字,M个操作, 区间L, R. 然后问经过M个操作后落在[L, R]的概率. * ...

  9. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

随机推荐

  1. vue对特殊特性的研究

    key 预期:number | string key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes.如果不使用 key,Vue 会使用一种最大限度减少 ...

  2. python学习笔记(九)内置函数

    print(all([1,2,3,4]))#判断可迭代的对象里面的值是否都为真 True print(any([0,1,2,3,4]))#判断可迭代的对象里面的值是否有一个为真 True print( ...

  3. ht-5 treemap特性

    (1)TreeMap类通过使用红黑树实现Map接口 (2)TreeMap提供按排序顺序存储键值对的有效手段,同时允许快速检索 (3)不同于散列映射,树映射保证它的元素按键的自然顺序升序排列 (4)Tr ...

  4. git使用技巧总结

    一.把github上的代码下载下来 git clone ...... 二.把修改的代码提交上去 git add .... git commit -m "........" git ...

  5. 连接超时(connect timed out)和读取超时(Read timed out)

    设置连接超时和读取超时方法: RequestConfig config=RequestConfig.custom() .setConnectTimeout(10000) // 设置连接超时时间 10秒 ...

  6. gradle自动化打包apk

    前堤是要在安卓项目中配置好gradle.build脚本 ## !/bin/sh ## 项目名 ##使配置文件生效,否则会报gradle:命令找不到 source /etc/profile TARGET ...

  7. Jenkins使用六:搭建流水线任务

    流水线可以把多个任务串起来,比如发布版本的一系列流程 配置流水线任务 构建语法为Groovy,执行3次test(job名) node { stage("test") { echo ...

  8. 让Debian以root登录

    Debian默认不允许root登录,所以修改之. (1)让Debian以root登录 修改gdm3的登录pam文件 #vi /etc/pam.d/gdm3 将auth required pam_suc ...

  9. springboot启动脚本

    #!/bin/sh JAVA_HOME="/ulic1/jdk/jdk1.8.0_201/bin" export JAVA_HOME lsof -i:9010 |awk '{pri ...

  10. JNDI配置笔记

    先在tomcat Context.xml配置文件中配置 <Resource name="jdbc/elifecrm" type="javax.sql.DataSou ...