直接不容易算,考虑拆成位处理. 设f[i]表示i到n的期望路径异或和(仅考虑某一位),则$f[y]=\sum\limits_{exist\ x1\to y=0}\frac{f[x1]}{d[x1]}+\sum\limits_{exist\ x2\to y=1}\frac{1-f[x2]}{d[x2]}$. 对于重边,直接在系数上+1即可.对于自环,只计算一次度数即可. #include<cstdio> #include<cstring> #include<iostream&g…
题意 题目链接 Sol 期望的线性性对xor运算是不成立的,但是我们可以每位分开算 设\(f[i]\)表示从\(i\)到\(n\)边权为1的概率,统计答案的时候乘一下权值 转移方程为 \[f[i] = (w = 1) \frac{1 - f[to]}{deg[i]} +(w = 0) \frac{f[to]}{deg[i]} \] 高斯消元解一下 注意:f[n] = 0,有重边! #include<bits/stdc++.h> using namespace std; const int MA…
[BZOJ2337]Xor和路径(高斯消元) 题面 BZOJ 题解 我应该多学点套路: 对于xor之类的位运算,要想到每一位拆开算贡献 所以,对于每一位拆开来看 好了,既然是按位来算 我们就只需要计算从\(1\)号点开始 到\(n\)的路径中,路径的异或和为\(1\)的概率 显然没法算 还是一样的 考虑高斯消元 对于每一个节点\(i\) \[f[i]=\sum_{w(u,i)=1}\frac{1-f[u]}{op[u]}+\sum_{w(u,i)=1}\frac{f[u]}{op[u]}\] 其…
[题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不满足期望的线性,所以考虑拆位. 对于每一个二进制位,经过边权为0仍是x,经过边权为1变成1-x(转化成减法才满足期望的线性). 设f[x]表示点x到n的路径xor期望,f[n]=0,根据全期望公式: $$f[i]=\sum_{j}\frac{f[j]}{out[i]}\ \ , \ \ w(i,j)=0$$…
首先,我们发现,因为是无向图,所以相连的点之间是有"依赖性"的,所以不能直接用dp求解. 因为是xor,所以按位处理,于是列线性方程组,设$ x[i] $为点i到n异或和为1的期望,因为从1到n和从n到1一样,所以选择倒着推,即, if(deg[e[i].va]==0) \[ x[u]=\sum_{v}^{v\subset son(u)}\frac{x[v]}{deg[i]} \] else \[ x[u]=\sum_{v}^{v\subset son(u)}\frac{1-x[v]}…
正题 题目链接:https://www.luogu.com.cn/problem/P3211 题目大意 一个\(n\)个点\(m\)条边的无向图,从\(1\)到\(n\)随机游走.求期望路径异或和. \(2\leq n\leq 100,1\leq m\leq 10^4\) 解题思路 因为是异或的期望,很难直接处理,所以考虑按位考虑每一位是\(1\)的概率. 然后\(n\)很小就是一个很显然的高斯消元了.设\(f_i\)表示\(i\sim n\)是\(1\)的概率. \[f_x=\frac{1}{…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2337 题意:给定一个带权无向图.从1号点走到n号点.每次从当前点随机(等概率)选择一条相邻边走下去.每条到达n的路径的值为走过的边权的抑或.求期望. 思路:将权值按照二进制位一位一位进行.设f[i]表示从i节点走到n节点的期望.i的度数为d[i].那么若一条边(i,j)的权值为0,则f[i]+=f[j]/d[i]:否则f[i]+=(1-f[j])/d[i]. #include <ios…
题目 题解 突然get到这样路径期望的题目八成是高斯消元 因为路径上的dp往往具有后效性,这就形成了一个方程组 对于本题来说,直接对权值dp很难找到突破口 但是由于异或是位独立的,我们考虑求出每一位的期望 设\(f[i]\)为从节点\(i\)出发到达N的期望值 有\(f[i] = \frac{f[j]}{degree[i]} + \frac{1 - f[k]}{degree[i]} [edge(i,j) = 0,edge(i,k) = 1]\) 因为如果出边权值为0,异或之后值不变,等于\(f[…
题面 题解:因为异或不太好处理,,,因此按位来算,这样最后的答案就是每一位上的值乘对应的权值再求和.本着期望要倒退的原则,,,我们设$f[i]$表示从$i$到$n$,xor和为1的概率.那么观察$xor$的规则:1 xor 1 = 00 xor 1 = 1 ----> 当xor 1时,结果为1的概率 = 原本为0的概率1 xor 0 = 1 0 xor 0 = 0 ----> 当xor 0时,结果为1的概率 = 原本为1的概率因此我们有如下转移:$$f[x] = \frac{1}{d_{x}}…
题解: 异或操作是每一位独立的,所以我们可以考虑每一位分开做. 假设当前正在处理第k位 那令f[i]表示从i到n 为1的概率.因为不是有向无环图(绿豆蛙的归宿),所以我们要用到高斯消元. 若有边i->j 权值为w,若w的k位为0,则f[i]+=1/du[i] * f[j],否则f[i]+=(1-f[j])/du[i] 注意我们现在在往回走,所以度数是i的而不是j的. 然后就可以高斯消元解出来了. 装X用模方程的lcm然后发现导致误差越来越大,WA出翔 代码: #include<cstdio&g…