CF908D Arbitrary Arrangement
题目大意:
给定三个数\(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的更多相关文章
- Codeforces 908 D.New Year and Arbitrary Arrangement (概率&期望DP)
题目链接:New Year and Arbitrary Arrangement 题意: 有一个ab字符串,初始为空. 用Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾 ...
- 【CodeForces】908 D. New Year and Arbitrary Arrangement
[题目]Good Bye 2017 D. New Year and Arbitrary Arrangement [题意]给定正整数k,pa,pb,初始有空字符串,每次有pa/(pa+pb)的可能在字符 ...
- [CodeForces]908D New Year and Arbitrary Arrangement
设状态f[i][j]表示有i个a,j个ab的期望 发现如果i+j>=k的话就再来一个b就行了. #include <iostream> #include <cstdio> ...
- Codeforces New Year and Arbitrary Arrangement
New Year and Arbitrary Arrangement time limit per test2 seconds You are given three integers k, pa a ...
- [CF908D]New Year and Arbitrary Arrangement
题面在这里 题意 给定三个数\(k,pa,pb\),每次有\(\frac{pa}{pa+pb}\)的概率往后面添加一个'\(a\)',每次有\(\frac{pb}{pa+pb}\)的概率往后面添加一个 ...
- CF908D New Year and Arbitrary Arrangement(期望Dp+数学)
题目大意:给你一个空字符串,你有\(\frac{pa}{pa+pb}\)的概率往字符串最后面加个\(a\),\(\frac{pb}{pa+pb}\)的概率往字符串最后面加个\(b\),当子序列\(ab ...
- CF908D New Year and Arbitrary Arrangement 期望、DP
题目传送门 题意:给出正整数$pa,pb,k$,最开始你有一个空串,每一次你有$\frac{pa}{pa + pb}$的概率向串最后放一个$a$,有$\frac{pb}{pa + pb}$的概率向串最 ...
- 【CF908D】New Year and Arbitrary Arrangement
Problem Description 给定三个数 \(k,pa,pb\) ,每次有 \(\frac{pa}{pa+pb}\) 的概率往后面添加一个 a,有 \(\frac{pb}{pa+pb}\) ...
- $CF908D\ New\ Year\ and\ Arbitrary\ Arrangement$ 期望$dp$
正解:期望$dp$ 解题报告: 传送门$QwQ$ 阿关于题目里那个形如$ab$的子序列我说下,,,我我我之前$get$了好久$QAQ$.这里子序列的个数的定义是这样儿的,举个$eg$,$aabb$,就 ...
随机推荐
- SpringBoot学习之Json数据交互
最近在弄监控主机项目,对javaweb又再努力学习.实际的项目场景中,前后分离几乎是所以项目的标配,全栈的时代的逐渐远去,后端负责业务逻辑处理,前端负责数据展示成了一种固定的开发模式.像thymele ...
- 获取网站证书的两种方法(wireshark or firefox nightly)
一.使用Wireshark 截取数据包的方式 1. wireshark软件需要使用管理员权限运行,开始捕获后,按下ctrl + f,查找证书所在分组,从source 和destination 栏可以看 ...
- CocosCreator游戏开发---菜鸟学习之路(三)如何在CocosCreator中使用Pomelo
PS(废话): 这段时间都在研究网易的Pomelo框架,作为新手小白,自然遇到了不少坑爹的事情.(当然也有可能是因为自己技术不过关的原因所以导致在很多基础的问题上纠结了很久.)网上也搜索了好久,但是基 ...
- MYSQL EXPLAIN执行计划命令详解(支持更新中)
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是根据官网中的每个一点来翻译.举例.验证的:英语不好,所 ...
- tomcat使用cookies缓存的时候中文报错解决办法 java.lang.IllegalArgumentException: Control character in cookie value or attribute.
报错出现 java.lang.IllegalArgumentException: Control character in cookie value or attribute. at org.apac ...
- QWebSocketServer
QWebSocketServer 服务端 Public Types Public Function QWebSocketServer(const QString &serverName, Ss ...
- 你不知道的JavaScript之类型
JavaScript是一门简单易用的语言,应用广泛,同时它的语言机制又十分复杂和微妙,即使经验丰富的开发人员也需要用心学习才能真正掌握. <你不知道的JavaScript>中是这样定义类型 ...
- 天气类API调用的代码示例合集:全国天气预报、实时空气质量数据查询、PM2.5空气质量指数等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 全国天气预报:数据来自国家气象局,可根据地名.经纬度GPS.IP查 ...
- Redis 设置开机启动
1. 将下列代码保存为文件redis, 置于 /etc/init.d 下面 ########################### # chkconfig: 2345 90 10 redis服务必须在 ...
- 科普 TLS 1.3—新特性与开启方式
TLS 1.3 协议针对安全强化及效率提升等方面进行了大量修改,相继推出 20 多个草案版本,即将完成最终的标准化.标准完成后,OpenSSL 组织将推出 OpenSSL 1.1.1 版本,对 TLS ...