关于有向图走“无限次”后求概率/期望的口胡/【题解】HNCPC2019H 有向图
关于有向图走“无限次”后求概率/期望的口胡/【题解】HNCPC2019H 有向图
全是口胡 假了不管
讨论的都是图\(G=(V,E),|V|=n,|E|=m\)上的情况
“走无限次”这个概念很抽象,严谨的证明以及描述和概率的收敛性有关,由于我也不会在此就不讨论这些,但是根据一些概率的知识,可以发现,其实走无限次可以这样描述:
由于使用概率不好描述在无限次的情况时,每个点和点之间的关系,所以用期望。到时候根据期望的定义式反过来求概率。可能的问题是,“不是走无限次吗,那怎么用期望反过来求概率?”。举个例子,假若只有一个起点且存在那些游戏黑洞(过去了走不来),那么所有随机变量\(X=1\),所以\(E(X)=XP(X)=P(X)\)。
这是因为期望可以很方便的描述点与点之间的关系(用概率的话,不好描述走无限次的“过程”,在从0次走到无穷次的途中的关系不好用概率描述(因为概率是一个相乘的关系,而期望是相乘且求和(概率不也是吗?我也不知道我在说什么,可能这段话是强行解释,因为我做的题都是用这个得到初始条件的)))
设\(e=[f_i\dots]\)是\(i\)点的期望构成的行向量,至于我们如何定义“i点的期望”,具体问题具体分析。
设矩阵\(A_{n\times n}\)是“增广矩阵”(我xjb取的名字),其中\(A_{i,j}\)表示由\(i\)点转移到\(j\)点的概率(到底如何定义具体情况具体分析,这里是笼统的口胡),那么走无限次可以这样描述:
\]
然后对比\(f_i\)系数,
可以得到\(n\)个方程。但是这\(n\)个是解出不来值的(全是 \(f_i=0\)),为什么?
这是因为忽略了初始条件,很显然\(e\times A=e\)有且只有一个解就是\(e= 0(A\not = O)\) ,必须要根据\(f_i\)的定义加入初始条件才行(比如\(f_i\)+=c之类的)。从这里我们可以知道,\(f_i\)的含义要方便我们加入初始条件。
由这\(n\)的个方程可以最坏\(O(n^3)\)解出来所有\(f_i\)。在\(A\)矩阵不同的特征或者性质下,可能有别的方法求解\(f_i\)
口胡好爽...
接下来是具体问题具体分析的例子
【题解】HNCPC2019H 有向图
“照本宣科”,设\(f_i\)是经过\(i\)点的期望次数,概率矩阵基本上已经告诉我们了,那么我们直接解就行了。
然而值得注意的是,由于这个概率矩阵的特性,可以得到\(f_i,i\le n\)的解,然后再求剩下的那些期望。
方程是
\begin{cases}
\sum_\limits{j} A_{j,i}f_j+1 &(n=1)
\\
\sum_\limits{j} A_{j,i}f_j &(n>1)
\end{cases}
\]
高斯消元
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define DEBUG(s) cerr<<(#s)<<" = "<<(s)<<endl
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(!isdigit(c))f|=c==45,c=getchar();
while(isdigit(c)) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int mod=1e9+7;
inline int ksm(const int&ba,const int&p){
int ret=1;
for(int t=p,b=ba;t;t>>=1,b=1ll*b*b%mod)
if(t&1) ret=1ll*ret*b%mod;
return ret;
}
inline int inv(const int&x){return ksm(x,mod-2);}
const int maxn=505;
int n,m;
struct MAT{
int data[maxn];
MAT(){memset(data,0,sizeof data);}
inline int&operator[](int x){return data[x];}
inline MAT operator *(const int&x){
MAT ret;
for(int t=1;t<=n+1;++t) ret[t]=1ll*data[t]*x%mod;
return ret;
}
inline MAT operator *=(const int&x){return *this=*this*x;}
inline MAT operator -(const MAT&a){
MAT ret;
for(int t=1;t<=n+1;++t) ret[t]=(data[t]-a.data[t]+mod)%mod;
return ret;
}
inline MAT operator -=(const MAT&a){return *this=*this-a;}
inline void print(){
for(int t=1;t<=n+1;++t) printf("%d ",data[t]);
putchar('\n');
}
}e[maxn];
int p[maxn][maxn<<1];
inline void Solve(){
for(int t=1;t<=n;++t){
e[t]*=inv(e[t][t]);
for(int i=1;i<=n;++i)
if(i^t) e[i]-=(e[t]*e[i][t]);
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
memset(e,0,sizeof e);
memset(p,0,sizeof p);
for(int t=1,in=inv(10000);t<=n;++t)
for(int i=1;i<=m+n;++i)
p[t][i]=1ll*qr()*in%mod;
for(int t=1;t<=n;++t){
for(int i=1;i<=n;++i) e[t][i]=p[i][t];
e[t][t]=(e[t][t]-1+mod)%mod;
}
e[1][n+1]=mod-1;
Solve();
for(int t=1;t<=m;++t){
int ans=0;
for(int i=1;i<=n;++i) ans=(ans+1ll*e[i][n+1]*p[i][t+n])%mod;
printf("%d ",ans);
}
putchar('\n');
}
return 0;
}
关于有向图走“无限次”后求概率/期望的口胡/【题解】HNCPC2019H 有向图的更多相关文章
- 概率与期望详解!一次精通oi中的概率期望
目录 基础概念 最大值不超过Y的期望 概率为P时期望成功次数 基础问题 拿球 随机游走 经典问题 期望线性性练习题 例题选讲 noip2016换教室 区间交 0-1边树求直径期望 球染色 区间翻转 二 ...
- 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】
刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...
- BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
- BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)
题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...
- Sql示例说明如何分组后求中间值--【叶子】
原文:Sql示例说明如何分组后求中间值--[叶子] 这里所谓的分组后求中间值是个什么概念呢? 我举个例子来说明一下: 假设我们现在有下面这样一个表: type name price -- ...
- 一个n*n 的方格,要从左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走动的方法数。
题目一:一个n*n 的方格,要从左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走动的方法数. 分析:对于第(i,j)个格子,只有向右走一步到达或者向左走一步到达,dp(i,j) = d(i ...
- hdu3076--ssworld VS DDD(概率dp第三弹,求概率)
ssworld VS DDD Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- 当半导体的工艺制程走到7nm后
https://mp.weixin.qq.com/s/LjFTtEKFX2o8kLjn3y6GbQ 深度学习的异构加速技术1:效率因通用而怠,构架为AI而生 一方面,当半导体的工艺制程走到7nm后,已 ...
- 传递闭包+求概率——列项相消法lightoj1321好题
主要是要想到边与边的通过概率是独立的,所以先求出最终的概率,然后用推出的公式求总期望即可 最终概率E[0][n-1],可以用传递闭包来做 裂项相消法都不会了.. /* 闭包上推期望 每条边都具有独立性 ...
随机推荐
- jquery attr()和prop()方法的区别
$('').attr()返回的是html对象 $('').prop()返回的是DOM对象 attr(): attr() 方法设置或返回被选元素的属性和值. 当该方法用于返回属性值,则返回第一个匹配元素 ...
- C#面向对象基础--类与对象
1.类与对象 类是面向对象编程的基本单元:类造出来的变量叫对象. 一个类包含俩种成员:字段与方法. 字段即变量,方法即函数. 面向对象思想:教给我们如何合理的运用类的规则去编写代码. 2.类的字段 字 ...
- Libev源码分析02:Libev中的IO监视器
一:代码流程 在Libev中,启动一个IO监视器,等待该监视器上的事件触发,然后调用该监视器的回调函数.整个的流程是这样的: 首先调用ev_default_loop初始化struct ev_loop ...
- @noi.ac - 170@ 数数
目录 @description@ @solution@ @accepted code@ @details@ @description@ 求有多少对 1 ∼ n 的排列 (a, b) 满足 \(m \l ...
- display的值和对应的意义
none:隐藏对应元素,不为隐藏的对象保留其物理空间 block:指定对象为块元素 inline:指定对象为内联元素 inline-block:指定对象为内联块元素 table:指定对象为块元素的表格 ...
- PL/SQL语言的学习笔记
一.PL/SQL简介1.什么是PL/SQL程序?(PL/SQL是对SQL语言的一个扩展,从而形成的一个语言) 2.PL/SQL语言的特点(操作Orcale数据库效率最高的就是PL/SQL语言,而不是C ...
- 2019-10-31-Resharper-去掉注释拼写
title author date CreateTime categories Resharper 去掉注释拼写 lindexi 2019-10-31 9:8:5 +0800 2018-09-04 1 ...
- dotnet 设计规范 · 抽象类
X 不要定义 public 或 protected internal 访问的构造函数.默认 C# 语言不提供抽象类的公开构造函数方法. 如果一个构造函数定义为公开,只有在开发者需要创建这个类的实例的时 ...
- 【u224】传送机
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 刷完牙洗完脸,黄黄同学就要上课去了.可是黄黄同学每次去上课时总喜欢把校园里面的每条路都走一遍,当然,黄 ...
- H3C DNS域名解析原理