题目大意:

给定三个数\(k\) , \(p_a\) , \(p_b\)
每次有\(\frac{p_a}{p_a+p_b}\)的概率往后面添加一个'a'
每次有\(\frac{p_b}{p_a+p_b}\)的概率往后面添加一个'b'
当出现了\(k\)个形如 \(ab\) 的子序列(不用连续)时停止
求最后期望得到的ab子序列个数。答案对\(10^9+7\)取模。

思路与解法:

\(f[i][j]\) 表示前缀中有 \(i\) 个'a',有 \(j\) 个'ab'子串的串 的期望最终'ab'个数。
转移太容易了:
( 1 ) \(i+1\)是'a': \(\ \ \)\(f[i][j] = f[i][j] + \frac{p_a}{p_a+p_b}*f[i+1][j]\)
( 2 ) \(i+1\)是'b':\(\ \ \) \(f[i][j] = f[i][j] + \frac{p_b}{p_a+p_b}*f[i][i+j\ ]\)
显然形如\(bbbbb...bbbabbabab\)这样的串,在第一个'a'之前的部分都是没有意义的。
所以我们的目标状态为\(f[1][0]\),代表所有串。
但显然这样是没法转移的,因为\(a\)也可能会无限制的增长。
考虑把这种情况单独算:
若\(k \leq i+j\),设\(S = f[i][j]\) , \(p_a = \frac{p_a}{p_a+p_b}\) , \(p_b = \frac{p_b}{p_a+p_b}\)。
推一波式子:
\[S = (i+j)p_b + p_a(i+j+1)p_b + p_a^2(i+j+2)p_b+....\]
\[p_aS = p_a(i+j)p_b + p_a^2(i+j+1)p_b + p_a^3(i+j+2)p_b+....\]
\[(1-p_a)S = (i+j)p_b + p_b(p_a+p_a^2+p_a^3+....)\]
\[(1-p_a)S = (i+j)p_b + p_b\frac{p_a(1-p_a^∞)}{1-p_a}\]
上面那个是等比数列求和公式,其中又有:\(p_a + p_b = 1\) ,\(\ \) \((1-p_a^∞)\ = 1\) , 所以
\[p_bS = (i+j)p_b + p_b\frac{p_a}{p_b}\]
\[f[i][j] = S = (i + j) + \frac{p_a}{p_b}\]
所以转移时,如果\(k \leq i+j\),用公式算,否则\(DP\)转移,最终答案存在\(f[1][0]\)中。

实现代码:

#include<bits/stdc++.h>
#define RG register
#define ll long long
#define _ 2005
#define mod 1000000007
using namespace std;
ll f[ _ ][ _ ] , k , pa , pb , invb , inv;

inline ll Pow(RG ll T,RG ll js,RG ll S){
while(js){if(js&1)S=S*T%mod; T=T*T%mod; js>>=1;}return S;}

int main(){
    cin >> k >> pa >> pb;
    invb = Pow( pb , mod-2 , 1 );
    inv = Pow( (pa+pb)%mod , mod-2 , 1 );
    for(RG int i = k; i >= 0; i --)
        for(RG int j = k; j >= 0; j --){
            if(!i && !j)continue;
            if(i + j >= k)
                f[ i ][ j ] = ( (i + j) + pa*invb%mod )%mod;
            else {
                f[ i ][ j ] += f[ i+1 ][ j ] * pa %mod * inv % mod;
                f[ i ][ j ] += f[ i ][ i+j ] * pb %mod * inv %mod;
                f[ i ][ j ] %= mod;
            }
        }
    cout << f[1][0] ;  return 0;
}

CF908D Arbitrary Arrangement的更多相关文章

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

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

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

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

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

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

  4. Codeforces New Year and Arbitrary Arrangement

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

  5. [CF908D]New Year and Arbitrary Arrangement

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

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

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

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

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

  8. 【CF908D】New Year and Arbitrary Arrangement

    Problem Description 给定三个数 \(k,pa,pb\) ,每次有 \(\frac{pa}{pa+pb}\) 的概率往后面添加一个 a,有 \(\frac{pb}{pa+pb}\) ...

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

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

随机推荐

  1. 启动mysql遇到1067问题

    最近安装sql的时候,出现一些问题:启动的时候出现1067错误 在网上找了很多方法,比如删除mysql安装目录下date的bdata1, ib_logfile0, .. 等innodb的文件, 比如修 ...

  2. CSS3 @keyframes 用法(简单动画实现)

    定义: 通过 @keyframes 规则,能够创建动画. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 在动画过程中,可以多次改变这套 CSS 样式. 以百分比来规定改变发生的时间,或 ...

  3. zabbix 网络模板自动发现端口时,过滤掉某些特定规则的端口,减少item的方法

    1.需求描述        默认情况下Zabbix 模板 中网络接口自动发现接口时,会产生很多item,有时候会有我们不需要的一些接口,这时候需要过滤掉他们.        比如我有一台运行kvm的服 ...

  4. 加快compser install 和update的方法

    加快compser install 和update的方法: 可以进入composer国内镜像里面进行参考 如下是修改composer.json文件来实现(在json配置的最后加上如下代码) " ...

  5. ubuntu16.04 python3 安装selenium及环境配置

    环境 ubuntu16.04 python3 安装selenium sudo pip3 install seleium 默认安装完是支持firefox,但是更新得太慢对于较新的firefox已经不支持 ...

  6. 登录功能(MD5加密)

    登录这个功能,是不管哪个项目都会用到的,登录做的好坏,安全性的保障将直接影响到整个系统的成败,尤其是一些安全性要求比较严格的项目 1.首先需要对密码进行加密,这里用到的是md5加密,需要在login. ...

  7. typeof操作符 返回值

    Type操作符 返回值 : 1undefined   这个未定义 2.boolean    这个为boolean类型 3.string      这个是字符串 4.number    这个就是数值 5 ...

  8. 为什么要使用Docker?

    作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势. 更高效的利用系统资源 由于容器不需要进行硬件虚拟及运行完整操作系统等额外开销,Docker对系统资源的利用率更高.无论是应 ...

  9. entity framework core在独立类库下执行迁移操作

    之前学习EFCore的时候,都是在VS创建的默认模板里面进行的,按照官方文档,直接就可以搞定. 今天新项目准备上.Net Core,打算先按照国际惯例,进行分层,数据访问层是用EFCore来做,于是就 ...

  10. nyoj49 开心的小明 01背包

    思路:dp(i, j)表示用金钱j去买前i个物品能得到的最大价值.转移方程dp(i, j) = max{dp(i-1, j), dp(i-1, j-p[i]) + p[i]*w[i]}. AC代码 # ...