期望概率 dp
-
期望就要倒推,因为如果是正推可能还要记录概率,而且感觉不正确
-
设 \(dp[i][j][0/1]\) 表示此时是第 \(i\) 节课,换了几次,这次换不换
-
预处理出两个点之间的最短路就可以了
- 可以先手动算一下,在第 7 位时能够组成的概率和在第 8 位是一样的,那么大胆猜结论,在每个位置的概率都是一样的,然后就没了
-
对于每个人,假设当前能取的值为 \(w\) ,那么它期望取到 \(\frac{w}{2}\)
-
那么这个题目答案就是 \(\frac{w}{2^k}\)
- 设 \(f_i\) 为已经取完 \(i\) 个,取完剩下的期望次数
-
但是期望的钱和期望步数不是直接挂钩的
-
设 \(g_i\) 表示相应需要的钱
- 和上题一样,答案就是 \(n(\frac{1}{1}+\frac{1}{2}+...\frac{1}{n})\)
-
一个朴素的思路就是求出每个牌作贡献的概率
-
那么问题就转换成了求一个牌 \(r\) 轮后会发动过的概率
-
考虑第一个牌,发动的概率:\(1-(1-p_i)^{r}\)
-
但是对于后面的牌来说,有一个很恶心的点在于如果前面发动了一个牌,那么就直接结束这一轮了
-
那么我们表示出一个牌在哪些轮是会被考虑到的
-
设 \(f[i][j]\) 表示所有游戏完了后前 \(i\) 个牌中出了 \(j\) 个的概率
-
\(P(i)=\sum_{j=0}^r f[i-1][j]*(1-(1-p_i)^{r-j})\)
-
那么我们就是要求 \(f[i][j]\)
-
考虑枚举 \(i\) 是否有贡献来转移就可以了
-
神题
-
首先有个性质:确定了所有灯的状态后最少的次数(必须的次数)就确定了,大概从右往左扫一遍就可以求出来了
-
还有个性质:每一个键都无法用其他键组合而成
-
也就是这些必须键必须按到具体上,如果按错了,那么还需要在同一个按键上按回来
-
那么设 \(f[i]\) 为从还剩 \(i\) 个必须键到还剩 \(i-1\) 个必须键的期望次数
-
分别表示按的是不是必须键
-
答案就是 \(f[cnt]+f[cnt-1]+...+f[k+1]\)
- 考虑每一对相邻的选项对答案的贡献
-
首先定一个根
-
设 \(f[i]\) 表示 \(i\) 到父亲的期望步数
- 设 \(g[i]\) 表示 \(fa[i]\) 到 \(i\) 的期望步数,同理
-
通过边界条件,\(f,g\) 可以线性求出
-
对于每个点求到根的和 \(F,G\)
-
那么考虑 \((u,v)\) ,其实就是 \(u\to lca(f)+lca\to v(g)\) 的一个贡献,也就是 \(F(u)-F(lca)+G(v)-G(lca)\)
-
那么考虑点 \(u\) 做 \(lca\) 时候的贡献,这个可以通过扫一遍子节点得到
-
总的复杂度就是 \(O(n)\)
-
考虑先求出每个点期望经过的次数,不能算 \(f_n\) ,因为到了 \(n\) 就停下了
-
那么对于一条边 \((u,v)\) 期望经过的次数就是 \(\frac{f_u}{d_u}+\frac{f_v}{d_v}\)
-
\(E(F_i)=E(F_{i-1}+\Delta_i)=E(F_{i-1})+E(\Delta_i)\)
-
当 \(x\) 时,\(E(\Delta_i)=0\)
-
当 \(o\) 时,假设之前的 \(o\) 的长度为 \(len\) ,\(E(\Delta_i)=E(2\times len+1)=2\times E(len)+1\)
-
当 \(?\) 时,\(E(\Delta_i)=\frac{0+2\times E(len)+1}{2}\)
-
所以我们在递推的时候,不只需要求期望的答案,还要求期望的长度
-
上面证明了为什么可以用期望的长度来算期望的长度
-
矩阵树定理实际上求的是 \(\sum_T \prod_{e\in T} p_e\)
-
这个题求的是 \(\sum_T\prod_{e\in T}p_e\frac{\prod_e (1-p_e)}{\prod_{e\in T} (1-p_e)}\)
-
把无关的提出来,剩下的就按照矩阵树定理来做
-
第一问好说
-
第二问,对于一棵树,我们考虑跟节点的两个子树
-
这两个子树之间的形态的概率是一样的
-
这个恰好不是很好看,改成大于等于
-
设 \(f[i][j]\) 表示 \(i\) 个叶子,深度 \(\geq j\) 的概率,那么
-
先将关键数字筛出来,假设有 \(k\) 个
-
那么就是求关键数字全部被选完最末尾的数字的期望位置,然后乘上 \(n!\)
-
那么求出最后一个位置在某个位置的概率,这个显然可以用组合数学来做
-
可以说很暴力的一个做法
-
先预处理出 \(nxt[u][v]\) 表示 \(u\) 向 \(v\) 的下一步是哪个点
-
设 \(f[u][v]\) 为 \(u\) 到 \(v\) 的期望,我们直接暴力的做,记忆化搜索
-
总的复杂度是 \(O(n^2)\)
-
\(E(i)=\sum_x P[t_i\geq x]\)
-
考虑第 \(x\) 轮 \(i\) 仍然存活的概率
-
我们将每次操作看成一种合并的话,总的方案数就是 \(x!\binom{n-1}{x}\)
-
对于一个数,找到它前面第一个比它大的数,和后面第一个比它大的数,假设为 \(pre,nxt\)
-
那么如果这个数和 \(pre\) 之后到自己的边合并,就不会有任何影响,否则自己一定就会被吃掉
-
设 \(pre-i\) 都被选的概率为 \(P(A)\) ,设 \(i-nxt\) 的概率是 \(P(B)\)
-
那么 \(P[t_i\geq x]=1-P(A)-P(B)+P(AB)\)
-
对于这种高维的期望,有一些套路
-
考虑对于一个序列的 \(E(\Delta)\) ,假设之前的联通块的长度为 \(x\)
-
\(E(i)=E((x+1)^k)\)
-
这个地方肯定不能将 \(x+1\) 拆了,因为 \(E(xy)=E(x)E(y)\) 只有在 \(x,y\) 不相关的时候有用
-
所以我们需要先用二项式在里面变换一下,再拆开
-
所以我们需要维护 \(E(x),E(x^1),...,E(x^k)\)
-
放在树上也是一样的套路
-
设 \(f[u][p]\) 表示以 \(u\) 为节点期望下 \(x^p\) 的和
-
设 \(sum[u]\) 表示以 \(u\) 为节点期望下除了 \(x\) 的联通块剩下的联通块的 \(k\) 次方和的期望
-
转移参考:
void dfs(int num)
{
f[num][0]=1;
for (int i=0,v;i<g[num].size();i++)
if (!f[v=g[num][i]][0]){
dfs(v);
sum[num]=(sum[num]+(mod+1-p[num])*f[v][k]+sum[v])%mod;
for (int j=k;j;j--){
ll sav=0;
for (int p=0;p<=j;p++)
sav=(sav+C[j][p]*f[num][p]%mod*f[v][j-p])%mod;
f[num][j]=sav;
}
}
for (int j=k;j;j--){
ll sav=0;
for (int p=0;p<=j;p++)
sav=(sav+C[j][p]*f[num][p])%mod;
f[num][j]=sav*p[num]%mod;
}
}
-
对于基环树,考虑先确定一个点为白点,然后就可以当成一条链来做
-
然后再确定这个点为黑点,确定下一个点为白点,然后就又可以当成一条链来做了,然后依次类推
-
那么复杂度就是 \(O(n^2k^2)\)
-
还有优化成 \(O(nk^3)\) ,这里就不说了
CF908D New Year and Arbitrary Arrangement
-
如果一开始是一堆 \(b\) ,可以把这些 \(b\) 都去掉,然后再继续
-
所以我们钦定第一个就是 \(a\)
-
每次放 \(a,b\) 对于前面的影响有关于前面的 \(a\) 数量,又因为有限制,所以带上前面 \(ab\) 的数量
-
因为是期望,考虑倒推
-
设 \(f[i][j]\) 表示前缀有 \(i\) 个 \(a\) ,有 \(j\) 个 \(ab\) 期望的子序列个数
-
边界就是 \(j+i\geq k\) ,此时就可以立刻停止了
-
\(i+j\geq k\) 时,期望的子序列个数就是 \(i+j+\frac{p_a}{p_b}\)
-
具体证明可以参考几何分布的证明,几个可能对推式子有用的式子:
CF804D Expected diameter of a tree
-
对于一次询问,可以做到 \(O(n)\)
-
对于多次询问,其实没有更好的解决方法了,而事实上对于这个题目有一点点根号分治的感觉
-
所以考虑记忆化,复杂度是正确的
-
可以发现最终的状态就是前面 \(x\) 个 0 ,后面全是 1
-
那么考虑上一轮是由哪一些状态转移过来
-
一种是上一次就是这样,然后选择到的是 \((1,1)\) 或者 \((0,0)\)
-
一种就是上一次的选择是 \((1,0)\) ,也就是我们需要知道上一次前 \(x\) 个位置中有 \(x-1\) 个 0 的概率
-
那么我们设 \(f_{i,j}\) 表示第 \(i\) 轮前 \(x\) 个中有 \(j\) 个 0 的概率
-
那么显然一个 \(j\) 只会和上一轮的 \(j-1,j,j+1\) 有关
-
观察到这个 \(n\leq 1e9\) ,那么很明显要用到矩乘
-
我们将这个系数矩阵建出来,然后矩乘就可以了