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$,就 ...
随机推荐
- Java中从控制台输入数据的几种常用方法(转)
一.使用标准输入串System.in //System.in.read()一次只读入一个字节数据,而我们通常要取得一个字符串或一组数字 //System.in.read()返回一个整数 //必须 ...
- arm-点亮led灯
点亮指路灯:学习四环节:led原理图分析,芯片手册导读,思维导图设计,为什么要使用led:通常led是作为程序调试的重要手段.led原理图:led实质为发光二极管,当其两端电压一定时,即处于导通状态. ...
- Linux(ubuntu)安装redis集群,redis集群搭建
今天学习一下redis集群的搭建.redis在现在是很常用的数据库,在nosql数据库中也是非常好用的,接下来我们搭建一下redis的集群. 一.准备 首先我们要安装c语言的编译环境,我们要安装red ...
- 轻松搭建Git服务器(Ubuntu)
搭建Git服务器 在远程仓库节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改. GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业 ...
- SpringBoot+Mybatis+PageHelper简化分页实现
前言 经过一段时间的测试和修改PageHelper插件逐渐走到了让我觉得靠谱的时候,它功能的就是简化分页的实现,让分页不需要麻烦的多写很多重复的代码. 已经加入我的github模版中:https:// ...
- ThinkPad W500 清灰记录
转载请注明出处:HateMath归来(http://www.cnblogs.com/hatemath/) 看型号就知道,这是一台英雄迟暮型的老电脑.到了夏天,启动后啥事不做,通风口都烫手.心情好,一时 ...
- 内置函数 -- bytes -- 字节码与字符串相互转换
说明: 1. 返回值为一个新的不可修改字节数组,每个数字元素都必须在0 - 255范围内,是bytearray函数的具有相同的行为,差别仅仅是返回的字节数组不可修改. 2. 当3个参数都不传的时候,返 ...
- Web渗透测试笔记(基础部分)
信息收集: dns信息收集 格式:dns... -参数 域名 -参数 示例: root@xxSec:~# dnsenum baidu.com root@xxSec:~# dnsenum -f dns. ...
- CDN网络架构
CDN(content delivery network 内容分发网络) 本质上就是提供缓存,使得用户总是能访问离他最近的服务器,akamai是世界上的第一家做CDN的公司 实例:构建CDN分发网络架 ...
- arm-linux-gcc: Command not found 问题解析 .
问题: sudo tar jxvf cross-2.95.3.tar.bz2 export PATH=$PATH:/usr/local/arm/2.95.3/bin 使用arm-linux-gcc – ...