关于有向图走“无限次”后求概率/期望的口胡/【题解】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\)点的概率(到底如何定义具体情况具体分析,这里是笼统的口胡),那么走无限次可以这样描述:

\[e\times A=e
\]

然后对比\(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\)的解,然后再求剩下的那些期望。

方程是

\[f_i=
\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 有向图的更多相关文章

  1. 概率与期望详解!一次精通oi中的概率期望

    目录 基础概念 最大值不超过Y的期望 概率为P时期望成功次数 基础问题 拿球 随机游走 经典问题 期望线性性练习题 例题选讲 noip2016换教室 区间交 0-1边树求直径期望 球染色 区间翻转 二 ...

  2. 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

  3. BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)

    1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...

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

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

  5. Sql示例说明如何分组后求中间值--【叶子】

    原文:Sql示例说明如何分组后求中间值--[叶子] 这里所谓的分组后求中间值是个什么概念呢? 我举个例子来说明一下: 假设我们现在有下面这样一个表: type        name price -- ...

  6. 一个n*n 的方格,要从左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走动的方法数。

    题目一:一个n*n 的方格,要从左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走动的方法数. 分析:对于第(i,j)个格子,只有向右走一步到达或者向左走一步到达,dp(i,j) = d(i ...

  7. hdu3076--ssworld VS DDD(概率dp第三弹,求概率)

    ssworld VS DDD Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  8. 当半导体的工艺制程走到7nm后

    https://mp.weixin.qq.com/s/LjFTtEKFX2o8kLjn3y6GbQ 深度学习的异构加速技术1:效率因通用而怠,构架为AI而生 一方面,当半导体的工艺制程走到7nm后,已 ...

  9. 传递闭包+求概率——列项相消法lightoj1321好题

    主要是要想到边与边的通过概率是独立的,所以先求出最终的概率,然后用推出的公式求总期望即可 最终概率E[0][n-1],可以用传递闭包来做 裂项相消法都不会了.. /* 闭包上推期望 每条边都具有独立性 ...

随机推荐

  1. 洛谷 3174 [HAOI2009]毛毛虫

    题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫了(图 2 ). 输入输出格 ...

  2. IOS开发之UISearchBar自定义外观

      MySearchBar.h如下: @interface MySearchBar : UISearchBar - (void)layoutSubviews; @end MySearchBar.m如下 ...

  3. uva 11174 Stand in a Line (排列组合)

    UVa Online Judge 训练指南的题目. 题意是,给出n个人,以及一些关系,要求对这n个人构成一个排列,其中父亲必须排在儿子的前面.问一共有多少种方式. 做法是,对于每一个父节点,将它的儿子 ...

  4. 洛谷P5664 Emiya 家今天的饭 问题分析

    首先来看一道我编的题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共 ...

  5. SuperSocket 服务器管理器客户端

    SuperSocket 服务器管理器当前有两种类型的客户端, Silverlight客户端和WPF客户端.这两种客户端的代码都在源代码中的"Management"目录,你可以自行编 ...

  6. poj 2451 Uyuw's Concert (半平面交)

    2451 -- Uyuw's Concert 继续半平面交,这还是简单的半平面交求面积,不过输入用cin超时了一次. 代码如下: #include <cstdio> #include &l ...

  7. JS 动态表格

    表格 在script里面使用innerHTML获取标签体的内容,然后进行添加. 删除则是不断的获取父节点,利用父节点删除子节点. 在做这个的时候,要主要获取表格table的对象有两种方式,一是getE ...

  8. 深入Java线程管理(二):线程的生命周期

    Java线程的生命周期 一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,使线程进入Running状态,真正 ...

  9. Python--day23--初识面向对象复习

    面向对象编程是大程序编程思想:

  10. [转][Linux/Ubuntu] vi/vim 使用方法讲解

    vi/vim 基本使用方法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的 ...