\(0.\) 前言

有一天 \(Au\) 爷讲期望都见到了此题,通过写题解来加深理解。

\(1.\) 题意

将初始为空的序列的末尾给定概率添加 \(a\) 或 \(b\),当至少有 \(k\) 对 \(ab\) 时停止(注意是“对”,中间可以间隔字符),求 \(ab\) 期望对数。

\(2.\) 思路

通过查看标签 通过阅读题面我们容易发现本题是一道期望 DP,但是本题的状态并不很容易想到,设 \(f[i][j]\) 表示前缀中有 \(i\) 个 \(a\),\(j\) 个 \(ab\) 停止后的期望个数,这样发现转移就容易了很多,不会被 \(a\) 和 \(b\) 纠缠不清,设 \(A = pa / (pa + pb)\),\(B = pb / (pa + pb)\),则有:

\[f[i][j] = A × f[i + 1][j] + B × f[i][j + 1]
\]

若 \(i + j ⩾ k\),则再加一个 \(b\) 就会结束,此时的期望 \(ab\) 数是:

\[i + j + pa / pb
\]

故终止状态为:

\[f[i][j] = i + j + pa / pb, i + j ⩾ k
\]

\(3.\) 解释

(本块主要针对 \(i + j + pa / pb\) 的推导,不感兴趣可以跳过)

我一直疑惑 \(i + j + pa / pb\) 如何得出。

解释一下,在前缀有了 \(i\) 个 \(a\),构成了 \(j\) 组 \(ab\) 的情况下,若 \(i + j ⩾ k\),这个状态的后继情况能是容易看到的:选 \(a\) ,然后继续抉择,或选 \(b\) ,就此停止。多选一个 \(a\),就意味着最后的 \(ab\) 串又多了一个。 那么得出无限和式:

\[{b \over pa+pb}×\sum_{a=0}^{∞}(i+j+a)×({pa \over pa+pb})^{a}
\]

接下来的证明部分参考一粒夸克的博客

首先是等差乘等比数列求和公式

\[(1):A=a+(a+p)×p+(a+2×b)×p^2+...+(a+n×b)×p^n
\]
\[(2):A×p=a×p+(a+b)×p^2+(a+2×b)×p^3+...+(a+n×b)×p^{n+1}
\]
\[(1)-(2):A×(1-p)=a+b×(p+p^2+p^3+...+p^n)-(a+n×b)p^{n+1}
\]
\[A×(1-p)=a+b×p×{1-p^n \over 1-p}-(a+n×b)×p^{n+1}
\]
\[A={a\over1-p}+b×{p-p^{n+1}\over(1-p)^2}-{(a+n×b)×p^{n+1}\over1-p}
\]

将公式代入无限和式

\[{pb \over pa+pb}×(\sum_{a=0}^{∞}(i+j+a)×({pa \over pa+pb})^{a})
\]
\[={pb\over pa+pb}×({i+j\over1-{pa\over pa+pb}}+{{pa \over pa+pb}-({pa \over pa+pb})^{∞+ 1} \over (1-{pa \over pa+pb})^2}-{(i+j+n)×({pa \over pa+pb})^{∞+1} \over1-{pa \over pa+pb}})
\]
\[={pb\over pa+pb}×({i+j \over {pb \over pa+pb}}+{{pa \over pa+pb}-({pa \over pa+pb})^{∞+ 1} \over ({pb \over pa+pb})^2}-{(i+j+n)×({pa \over pa+pb})^{∞+1} \over{pa \over pa+pb}})
\]
\[=i+j+{{pa \over pa+pb}-({pa \over pa+pb})^{∞+ 1} \over {pb \over pa+pb}}-(i+j+n)×({pa \over pa+pb})^{∞+ 1}
\]
\[=i+j+{{pa \over pa+pb}\over {pb \over pa+pb}}
\]
\[=i+j+{pa \over pb}
\]

(这么巨量\(\LaTeX\)我都打了,求赞)

\(4.\) 细节

  1. 由于 \(f[0][0]\) 会转移到自己,递归记忆化会死循环,从 \(f[1][0]\) 开始算,当序列前有一堆 \(b\) 的情况没有意义,可以跳到第一个 \(a\) 发生时开始算。初始状态选取 \(f[1][0]\)。
  2. 当 \(a\) 与 \(ab\) 的个数相加已经大于 \(k\) 了,这是就不关心有多少 \(a\) 了,只需要有一个 \(b\) 就可以结束了,这样可以把两维都控制在 \(O(k)\) 的复杂度

\(5.\) 代码

这是一份逆推实现的代码:

#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define int long long
using namespace std; template<class T> inline void read(T &x){
x = 0; register char c = getchar(); register bool f = 0;
while(!isdigit(c)) f ^= c == '-', c = getchar();
while(isdigit(c)) x = x * 10 + c - '0', c = getchar();
if(f) x = -x;
} template<class T> inline void print(T x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) print(x / 10);
putchar('0' + x % 10);
} const int N = 1010;
const int mod = 1e9 + 7;
int n, pa, pb, A, B, C;
int f[N][N]; inline int qpow(int a, int b){
int res = 1;
while(b){
if(b & 1) res = 1ll * res * a % mod;
a = 1ll * a * a % mod, b >>= 1;
}
return res;
} inline int work(int x){
return qpow(x, mod - 2);
} signed main(){
read(n), read(pa), read(pb);
A = 1ll * pa * work(pa + pb) % mod;
B = 1ll * pb * work(pa + pb) % mod;
C = 1ll * pa * work(pb) % mod;
for(int i = n; i >= 1; --i)
for(int j = n; j >= 0; --j){
if(i + j >= n) f[i][j] = (i + j + C) % mod;
else f[i][j] = (1ll * A * f[i + 1][j] % mod + 1ll * B * f[i][j + i] % mod) % mod;
}
print(f[1][0]), puts("");
return 0;
}

这是一份记搜实现的代码片段:

inline int dp(int i, int j){
if(i + j >= k) return (i + j + C) % mod;
if(~ f[i][j]) return f[i][j];
return (1ll * A * dp(i + 1, j) + 1ll * B * dp(i, j + i)) % mod;
}

CF908D New Year and Arbitrary Arrangement 题解的更多相关文章

  1. [CF908D]New Year and Arbitrary Arrangement

    题面在这里 题意 给定三个数\(k,pa,pb\),每次有\(\frac{pa}{pa+pb}\)的概率往后面添加一个'\(a\)',每次有\(\frac{pb}{pa+pb}\)的概率往后面添加一个 ...

  2. CF908D New Year and Arbitrary Arrangement(期望Dp+数学)

    题目大意:给你一个空字符串,你有\(\frac{pa}{pa+pb}\)的概率往字符串最后面加个\(a\),\(\frac{pb}{pa+pb}\)的概率往字符串最后面加个\(b\),当子序列\(ab ...

  3. CF908D New Year and Arbitrary Arrangement 期望、DP

    题目传送门 题意:给出正整数$pa,pb,k$,最开始你有一个空串,每一次你有$\frac{pa}{pa + pb}$的概率向串最后放一个$a$,有$\frac{pb}{pa + pb}$的概率向串最 ...

  4. $CF908D\ New\ Year\ and\ Arbitrary\ Arrangement$ 期望$dp$

    正解:期望$dp$ 解题报告: 传送门$QwQ$ 阿关于题目里那个形如$ab$的子序列我说下,,,我我我之前$get$了好久$QAQ$.这里子序列的个数的定义是这样儿的,举个$eg$,$aabb$,就 ...

  5. Codeforces 908 D.New Year and Arbitrary Arrangement (概率&期望DP)

    题目链接:New Year and Arbitrary Arrangement 题意: 有一个ab字符串,初始为空. 用Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾 ...

  6. 【CodeForces】908 D. New Year and Arbitrary Arrangement

    [题目]Good Bye 2017 D. New Year and Arbitrary Arrangement [题意]给定正整数k,pa,pb,初始有空字符串,每次有pa/(pa+pb)的可能在字符 ...

  7. [CodeForces]908D New Year and Arbitrary Arrangement

    设状态f[i][j]表示有i个a,j个ab的期望 发现如果i+j>=k的话就再来一个b就行了. #include <iostream> #include <cstdio> ...

  8. Codeforces New Year and Arbitrary Arrangement

    New Year and Arbitrary Arrangement time limit per test2 seconds You are given three integers k, pa a ...

  9. CF908D 【New Year and Arbitrary Arrangement】

    蒟蒻渣渣禹小心翼翼发布题解.... 这道题,嗯,期望,dp,好,我们有思路了.... however, 主要问题在于字符串无限延伸,so,我们需要考虑记录前缀的关键量来为DP设置终止状态. 我们不妨设 ...

随机推荐

  1. JavaScript实现按钮改变网页背景色

    运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...

  2. git的下载安装以及基本操作

    版权声明:本文为CSDN博主「~李疆」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.转载原文链接:https://blog.csdn.net/qq_403232 ...

  3. css换算rem单位

    地址:https://www.freetechs.cn/tool/rem2px.html

  4. 手动封装一个node命令集工具

    了解NPM安装模块时与项目配置文件中的bin配置发生了什么 了解nodejs在控制台中的运行环境及上下文 基于自定义命令集工具集成Yeoman 一.NPM模块安装内幕与nodejs控制台运行环境 1. ...

  5. Uncaught TypeError: document.getElementsById is not a function

    今天博主终于开始攻关javascript(俗称js)了,不过要注意了,它和java可是一丁点关系都没有,就像老婆饼和老婆一样. 下面就让我们来讨论一下博主这次犯下的低级错误吧 一.背景(解决方法在文末 ...

  6. 为什么HashMap使用红黑树而不使用AVL树

    为什么HashMap使用红黑树而不使用AVL树? 红黑树适用于大量插入和删除:因为它是非严格的平衡树:只要从根节点到叶子节点的最长路径不超过最短路径的2倍,就不用进行平衡调节 AVL 树是严格的平衡树 ...

  7. Vue入坑日记: day - 01

    前言 最近做了一些小项目,小组里写前端的确实有点拉胯,于是自己动手写前端,因为大一学过web前端基础,所以对HTML,CSS还有印象,就直接对JS下手了,学了两天把JS大致搞明白了,顺便对JQuery ...

  8. iOS全埋点解决方案-UITableView和UICollectionView点击事件

    前言 在 $AppClick 事件采集中,还有两个比较特殊的控件: UITableView •UICollectionView 这两个控件的点击事件,一般指的是点击 UITableViewCell 和 ...

  9. php实验一专属跳转博文

    今天完成了php关于设计个人博客主页的实验一作业. 这是php实验一作业中博客的跳转链接页.  

  10. OpenHarmony标准设备应用开发(一)——HelloWorld

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 邢碌 本文是 OpenAtom OpenHarmony(以下简称"OpenHarmony")标准设 ...