题目链接
设左边为白点,右边是黑点。
假设我们求的是1号和2号之间的路径期望长度(1号是白的2号是黑的)
我们可以从1号结点出发跑一个BFS,如果第i层黑色结点个数为l,那么2号就有l/m的几率是这一层的结点。
设 d p ( i , j , k , l ) dp(i,j,k,l) dp(i,j,k,l)为BFS到第i层的时候,已经用掉了j个白色结点,k个黑色结点,并且第i层的结点个数为l的概率。我们可以枚举下一层的结点个数t来转移:
假设当前层是白色层,下一层是黑色层,有(x=m-k)个黑点没有被bfs到,那么这x个黑点有t个和当前层的l个白点连边的概率为:
P = C x t ∗ ( 1 − ( 1 2 ) l ) t ∗ ( 1 2 ) l ( x − t ) P=C_x^t*(1-(\frac{1}{2})^l)^t*(\frac{1}{2})^{l(x-t)} P=Cxt∗(1−(21)l)t∗(21)l(x−t)
那么转移就是:
d p ( i + 1 , j , k + t , t ) + = d p ( i , j , k , l ) ∗ P dp(i+1,j,k+t,t)+=dp(i,j,k,l)*P dp(i+1,j,k+t,t)+=dp(i,j,k,l)∗P
白点同理。
按照这个思路,用longlong写出的比较好理解的代码:
#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) ((x)&(-(x)))
using namespace std;
ll mod;
ll qm(ll a, l