\(\mathcal{Description}\)

  Link.

  给定 \(n,p_a,p_b\),初始有一个空串,每次操作有 \(\frac{p_a}{p_a+p_b}\) 的概率在其后添加字符 \(\texttt{'a'}\),\(\frac{p_b}{p_a+p_b}\) 的概率添加字符 \(\texttt{'b'}\),当子序列 \(\{\texttt{'a'},\texttt{'b'}\}\) 的个数不小于 \(n\) 时,结束操作。求子序列的期望个数,对 \(10^9+7\) 取模。

  \(n\le1000\)。

\(\mathcal{Solution}\)

  显然状态,\(f(i,j)\) 表示有 \(i\) 个 \(\texttt{'a'}\),\(j\) 个 \(\{\texttt{'a'},\texttt{'b'}\}\) 的期望串长。为方便转移,令 \(p_a\) 为出现 \(\texttt{'a'}\) 的概率,\(p_b\) 同理。对于一般情况的转移:

\[f(i,j)=p_af(i+1,j)+p_bf(i,i+j)
\]

  当 \(i+j\ge n\),若再出现一个 \(\texttt{'b'}\),操作必然停止。那么:

\[\begin{aligned}
f(i,j)&=p_b\sum_{k=0}^{+\infty}p_a^k(i+j+k)\\
p_af(i,j)&=p_b\sum_{k=1}^{+\infty}p_a^k(i+j+k-1)\\
(1-p_a)f(i,j)&=p_b\left(i+j+\sum_{k=1}^{+\infty}p_a^k\right)\\
p_bf(i,j)&=p_b\left(i+j+\frac{p_a}{p_b}\right)\\
f(i,j)&=i+j+\frac{p_a}{p_b}
\end{aligned}
\]

  而初始状态有:

\[\begin{aligned}
f(0,0)&=p_af(1,0)+p_bf(0,0)\\
&=\frac{p_a}{1-p_b}f(1,0)\\
&=f(1,0)
\end{aligned}
\]

  DP 就好了 w。

\(\mathcal{Code}\)

#include <cstdio>
#include <cstring> typedef long long LL; const int MAXN = 1000, MOD = 1e9 + 7;
int n, pa, pb, div, f[MAXN + 5][MAXN + 5]; inline int add ( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline int mul ( LL a, const int b ) { return ( a *= b ) < MOD ? a : a % MOD; }
inline int sub ( int a, const int b ) { return ( a -= b ) < 0 ? a : a + MOD; } inline int qkpow ( int a, int b ) {
int ret = 1;
for ( ; b; a = mul ( a, a ), b >>= 1 ) ret = mul ( ret, b & 1 ? a : 1 );
return ret;
} inline int solve ( const int a, const int k ) {
if ( a + k >= n ) return add ( a, add ( k, div ) );
if ( ~ f[a][k] ) return f[a][k];
return f[a][k] = add ( mul ( pa, solve ( a + 1, k ) ), mul ( pb, solve ( a, a + k ) ) );
} int main () {
int ta, tb;
scanf ( "%d %d %d", &n, &ta, &tb );
memset ( f, -1, sizeof f );
pa = mul ( ta, qkpow ( add ( ta, tb ), MOD - 2 ) );
pb = mul ( tb, qkpow ( add ( ta, tb ), MOD - 2 ) );
div = mul ( pa, qkpow ( pb, MOD - 2 ) );
printf ( "%d\n", solve ( 1, 0 ) );
return 0;
}

Solution -「CF 908D」New Year&Arbitrary Arrangement的更多相关文章

  1. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  2. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

  3. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  4. Solution -「CF 923E」Perpetual Subtraction

    \(\mathcal{Description}\)   Link.   有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...

  5. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  6. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

  7. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  8. Solution -「CF 1023F」Mobile Phone Network

    \(\mathcal{Description}\)   Link.   有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...

  9. Solution -「CF 599E」Sandy and Nuts

    \(\mathcal{Description}\)   Link.   指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...

随机推荐

  1. c# - 关于位移符号 >> 和 << 的使用

    1.前言 这是对二进制数据进行位移的方法 2.操作 using System; namespace ConsoleApp1.toValue { public class test1 { public ...

  2. day4 对偶数、偶数位的操作

    1.函数fun()的功能:从低位开始取出整形变量s中偶数位上的数,依次构成一个新数放在t中.高位仍在高位. 效果理想:但是经测试的时候出现了错误 输入987654321时,打印出来的却是18681.经 ...

  3. 5.12-jsp分页功能学习

    1.分页功能相关资料查询 分页须知知识点: (1)JDBC2.0的可滚动结果集. (2)HTTP GET请求. 一.可滚动结果集   Connection con  = DriverManager.g ...

  4. C++ 基本类型的大小

    C++的基本类型: char bool (unsigned) short (int) (unsigned) int (unsigned) long (int) (unsigned) long long ...

  5. List子接口

    简介 特点: 有序, 有下标, 元素可以重复 常用方法 boolean add(E e) 将指定的元素追加到此列表的末尾(可选操作). void add(int index, E element) 将 ...

  6. Docker安装配置mysql

    Docker安装mysql踩坑日记 拉取镜像 sudo docker pull mysql:5.7 运行镜像 docker run -p 3306:3306 --name mysql -v /myda ...

  7. java-异常概述及体系

    1 package p1.exception; 2 3 4 /* 5 * 异常:是在运行时期发生的不正常情况. 6 * 7 * 8 * 在java中用类的形式对不正常情况进行了描述和封装对象. 9 * ...

  8. ansible roles实践——安装nginx

    1.创建roles 在/etc/ansible/roles目录下 1.1 手动创建需要的目录 1.2 使用命令创建,用不到的目录可以创建为空目录,但不可以不创建. 创建目录[root@master] ...

  9. logger命令

    logger是一个shell命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件()写入一行信息. -i 在记录上显示pid进程号 -t 给日志记录打标签 1.直接 ...

  10. 不难懂-----redux

    一.flux的缺陷 因为dispatcher和Store可以有多个互相管理起来特别麻烦 二.什么是redux 其实redux就是Flux的一种进阶实现.它是一个应用数据流框架,主要作用应用状态的管理 ...