题面

题解:因为异或不太好处理,,,因此按位来算,这样最后的答案就是每一位上的值乘对应的权值再求和。本着期望要倒退的原则,,,我们设$f[i]$表示从$i$到$n$,xor和为1的概率。
那么观察$xor$的规则:
1 xor 1 = 0
0 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}}(\sum_{val = 0, (x, y) \in E} f[y] + \sum_{val = 1, (x, y) \in E} (1 - f[y]))$$
$$d_{x} f[x] = \sum_{val = 0, (x, y) \in E} f[y] + \sum_{val = 1, (x, y) \in E} (1 - f[y])$$
$$d_{x} f[x] - \sum_{val = 0, (x, y) \in E} f[y] + \sum_{val = 1, (x, y) \in E} f[y] = \sum_{val = 1, (x, y) \in E} 1$$
于是我们可以发现我们一共有n个方程,n个元,于是高斯消元即可。注意$f[n] = 0$

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 110
#define ac 31000
#define LL long long const double eps = 1e-;
int n, m, maxn;
double ans;
int d[AC], id[AC];
int Head[AC], Next[ac], date[ac], len[ac], tot;
double f[AC][AC]; inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} inline void add(int f, int w, int S)
{
date[++ tot] = w, Next[tot] = Head[f], Head[f] = tot, len[tot] = S, ++ d[f];
if(f != w) date[++ tot] = f, Next[tot] = Head[w], Head[w] = tot, len[tot] = S, ++ d[w];
}//如果是自环的话只能算一次 inline void upmax(int &a, int b){
if(b > a) a = b;
} void pre()
{
n = read(), m = read(), id[] = ;
for(R i = ; i <= m; i ++)
{
int a = read(), b = read(), c = read();
add(a, b, c), upmax(maxn, c);
}
for(R i = ; i <= ; i ++) id[i] = id[i - ] << ;
} void check()
{
printf("\n");
for(int i = ; i <= n; i ++)
{
for(int j = ; j <= n + ; j ++) printf("%.2lf ", f[i][j]);
printf("\n");
}
} void gauss()
{
//check();
for(R i = , r = ; i <= n; i ++, r = i)
{
for(R j = i; j <= n; j ++)
if(fabs(f[j][i]) > eps) {r = j; break;}
if(fabs(f[r][i]) < eps) return ;
if(i != r) for(R j = ; j <= n + ; j ++) swap(f[i][j], f[r][j]);
for(R j = i + ; j <= n + ; j ++) f[i][j] /= f[i][i];
for(R j = ; j <= n; j ++)
{
if(i == j) continue;//是continue不是break啊。。。。
for(R k = i + ; k <= n + ; k ++) f[j][k] -= f[i][k] * f[j][i];
}
}
} void build(int lim)
{
memset(f, , sizeof(f));//先清空
for(R i = ; i < n; i ++)
{
f[i][i] = d[i];
for(R j = Head[i]; j; j = Next[j])
{
int now = date[j];
if(id[lim] & len[j]) ++ f[i][now], ++ f[i][n + ];
else -- f[i][now];//不能直接赋值,因为可能会涉及到自己,,于是本来就有系数,就是抵消一部分而不是覆盖全部了
}
}
//for(R i = 1; i <= n + 1; i ++) f[n][i] = (i == n);//特判最后一个点
f[n][n] = ;
} void work()
{
LL tmp = ;
for(R i = ; id[i] <= maxn; i ++)
{
build(i), gauss();
ans += f[][n + ] * tmp, tmp <<= ;
// printf("!!!%.3lf\n", ans);
}
printf("%.3lf\n", ans);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
work();
// fclose(stdin);
return ;
}

[HNOI2011]XOR和路径 概率期望 高斯消元的更多相关文章

  1. BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)

    题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...

  2. luoguP4457 [BJOI2018]治疗之雨 概率期望 + 高斯消元

    应该是最后一道紫色的概率了....然而颜色啥也代表不了.... 首先看懂题意: 你现在有$p$点体力,你的体力上限为$n$ 在一轮中, 1.如果你的体力没有满,你有$\frac{1}{m + 1}$的 ...

  3. [HNOI2013] 游走 - 概率期望,高斯消元,贪心

    假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...

  4. 4.23 子串 AC自动机 概率期望 高斯消元

    考虑40分. 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止.可以发现这个状态有环 需要高斯消元. 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+ ...

  5. BZOJ4820 SDOI2017硬币游戏(概率期望+高斯消元+kmp)

    容易想到的做法是建出AC自动机,高斯消元.然而自动机上节点数量是nm的. 注意到我们要求的变量只有n个,考虑将其他不用求的节点合并为一个变量.这个变量即表示随机生成一个串,其不包含任何一个模板串的概率 ...

  6. UVA-10828 (概率期望+高斯消元)

    题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个 ...

  7. luoguP3232 [HNOI2013]游走 贪心 + 概率期望 + 高斯消元

    首先,题目中的无向简单连通图代表着没有自环,重边... 总分的期望 = 每条边的期望之和...................每条边的期望又可以拆成$u \to v$的期望和$v \to u$的期望 ...

  8. 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元

    [题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...

  9. 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元

    [题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...

随机推荐

  1. js创建对象 object.create()用法

    Object.create()方法是ECMAScript 5中新增的方法,这个方法用于创建一个新对象.被创建的对象继承另一个对象的原型,在创建新对象时可以指定一些属性. 语法: Object.crea ...

  2. 【Unity3d】WWW类发起web连接

    初学unity3d,解决一个游戏与web服务器连接问题. 看了项目中原始代码,发现每次之前的程序员每次调用WWW类都需要写一遍StartCoroutine,然后各种重复代码. 于是写了一个简单的封装类 ...

  3. centos7 安装rabbitmq3.4.1-1

    安装环境:centos7版本 一.rabbitmq3.4.1-1安装环境配置: 安装erlang 1.创建Yum源 #创建yum源 sudo vi /etc/yum.repos.d/rabbitmq- ...

  4. Codeforces Round #503 (by SIS, Div. 2) D. The hat

    有图可以直观发现,如果一开始的pair(1,1+n/2)和pair(x, x+n/2)大小关系不同 那么中间必然存在一个答案 简单总结就是大小关系不同,中间就有答案 所以就可以使用二分 #includ ...

  5. 设计模式C++实现(1)——策略(Strategy)模式

    目录 策略模式 应用案例 实现的关键 Talk is cheap,let's See The Code 设计思想 参考 策略模式 策略模式定义了一系列算法和行为(也就是策略),他们可以在运行时相互替换 ...

  6. Node2vec 代码分析

    Node2vec 代码从Github上clone到本地,主要是main.py和node2vec.py两个文件. 下面把我的读代码注释放到上面来, import numpy as np import n ...

  7. Centos7 Ntp 时间服务器

    Centos7 Ntp 时间服务器 安装环境 [root@m02 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 安装 ...

  8. Thunder团队第七周 - Scrum会议4

    Scrum会议4 小组名称:Thunder 项目名称:i阅app Scrum Master:翟宇豪 工作照片: 宋雨在照相,所以不在相片中. 参会成员: 王航:http://www.cnblogs.c ...

  9. AOP:spring 的Annotation配置

    1.文件目录: 2.实体类 package com.wangcf.po; public class User { private int id; private String name; privat ...

  10. 马士兵老师hadoop讲解总结博客地址记录(啊啊啊啊啊,自己没有保存写好的博客...)

    http://www.cnblogs.com/yucongblog/p/6650822.html