[HNOI2011]XOR和路径 概率期望 高斯消元
题解:因为异或不太好处理,,,因此按位来算,这样最后的答案就是每一位上的值乘对应的权值再求和。本着期望要倒退的原则,,,我们设$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和路径 概率期望 高斯消元的更多相关文章
- BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)
题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...
- luoguP4457 [BJOI2018]治疗之雨 概率期望 + 高斯消元
应该是最后一道紫色的概率了....然而颜色啥也代表不了.... 首先看懂题意: 你现在有$p$点体力,你的体力上限为$n$ 在一轮中, 1.如果你的体力没有满,你有$\frac{1}{m + 1}$的 ...
- [HNOI2013] 游走 - 概率期望,高斯消元,贪心
假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...
- 4.23 子串 AC自动机 概率期望 高斯消元
考虑40分. 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止.可以发现这个状态有环 需要高斯消元. 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+ ...
- BZOJ4820 SDOI2017硬币游戏(概率期望+高斯消元+kmp)
容易想到的做法是建出AC自动机,高斯消元.然而自动机上节点数量是nm的. 注意到我们要求的变量只有n个,考虑将其他不用求的节点合并为一个变量.这个变量即表示随机生成一个串,其不包含任何一个模板串的概率 ...
- UVA-10828 (概率期望+高斯消元)
题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个 ...
- luoguP3232 [HNOI2013]游走 贪心 + 概率期望 + 高斯消元
首先,题目中的无向简单连通图代表着没有自环,重边... 总分的期望 = 每条边的期望之和...................每条边的期望又可以拆成$u \to v$的期望和$v \to u$的期望 ...
- 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元
[题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...
- 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元
[题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...
随机推荐
- 存一下emacs配置
(global-set-key [f9] 'compile-file)(global-set-key [f10] 'gud-gdb)(global-set-key (kbd "C-z&quo ...
- replace与replaceAll的区别
这两者有些人很容易搞混,因此我在这里详细讲述下. replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了 ...
- 详解UML图之类图
产品经理的必备技能之一是画UML图,本文就告诉你怎么画标准的类图吧.本文结合网络资料和个人心得所成,不当之处,请多指教. 1.为什么需要类图?类图的作用 我们做项目的需求分析,最开始往往得到的是一堆文 ...
- C#实现仪器的自动化控制
1.概述 生产测试当中,测试仪器不可或缺,如果是小规模生产,手动测试可以对付:但是要想到达大批量生产的目的,为了简化测试,节约时间,就需要进行自动化测试.出于这样的需求,对仪器的自动化程控就有了需求. ...
- 怎样安装TortoiseGit
TortoiseGit是基于Windows的Git图形化工具 访问 https://tortoisegit.org/
- loadrunner-录制脚本,设置代理,参数化,校验点,关联
详细记录一个脚本制作过程相关知识点 制作脚本 因为要做网页所以选择web协议,根据实际需要选择 选择浏览器地址,打开的网页网址,脚本存储地址以及初始化脚本,初始化脚本的目的是执行用例后不再执行此脚本中 ...
- python-redis哈希模式
命令: hset info name hgetall info hkeys info hvlls info m系列批量处理: ---------------------------------- ...
- 简述AQS原理
这是一道面试题:简述AQS原理 AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态.如果被请求的共享资源被占用,那么就需要一套线程阻塞 ...
- Codeforces Round #553 (Div. 2) C
C. Problem for Nazar time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 论文笔记:DeepFace: Closing the Gap to Human-Level Performance in Face Verification
2014 CVPR Facebook AI研究院 简单介绍 人脸识别中,通常经过四个步骤,检测,对齐(校正),表示,分类 论文主要阐述了在对齐和表示这两个步骤上提出了新的方法,模型的表现超越了前人的工 ...