首页 > 其他分享 >CF908D-New Year and Arbitrary Arrangement

CF908D-New Year and Arbitrary Arrangement

时间:2024-10-13 11:44:09浏览次数:11  
标签:p2 ll Arbitrary Arrangement p11 ans New dp mod

CF908D-New Year and Arbitrary Arrangement

前言

不是这题为啥星 \(2200\) 啊,感觉做的很多 \(3000\) 左右的题都比这道题水吧。

简化题意

给定空字符串,每次在串尾加入 \(a\) 或 \(b\) ,各有一定概率。

若其中有 \(\ge k\) 个 \(ab\) 子序列 , 则停止加入。

问至加入结束时,含有 \(ab\) 子序列个数的期望值。

\(k \le 1000\)

题解

感觉一眼概率 \(dp\) .

状态设计的话, \(k\) 这么小,感觉就像是二维。

那么我们分析一下,如果 \(k = 1 , p_a = p_b = \frac{1}{2}\)

存在什么情况捏,分两类。

  1. 第一位是 a : \(ab , aab , aaab , aaaaaaaaaaaaaaa \dots b\)

注意好像 \(a\) 可以有无限个。

  1. 第一位是 b : \(bab , bbab , baab , \dots\)

我们发现这种情况其实就是第一位是 a 的情况前面不知道加几个 b

所以我们只用统计第一种情况即可。

我们发现只要不存在逆天 \(aaaaaaaaaaaa \dots\)

\(a\) 的个数应该是 \(k\) 之内。如果存在较多 \(a\) , 那较多 \(a\) 处应该在串尾。

那我们证一下,如果存在前面 \(k + 1\) 个 \(a\) , 那加一个 \(b\) 直接就停止加入了,所以其在串尾。

有些长得帅的小伙伴就问了,好像 \(b\) 的个数更为确定在 \(k\) 内吧,为什么不用 \(b\) 转移?

欸,其实我最早想的就是 \(b\) , 但是由于无法判断新的概率值,所以没法转移。

所以 \(dp\) 状态很明显了, \(dp_{i , j}\) 表示 \(i\) 个 \(a\) , \(j\) 个答案子序列的概率和。

\[dp_{i , j} = dp_{i - 1 , j} \times p_a + dp_{i , j - i} \times p_b \]

好的,那概率有了,怎么统计答案?

呃呃呃这个时候就要想一想,如果每个位置都加 \(aaaaa \dots b\) , 那可能会重复的。

例: \(aabab\) 和 \(aab\)

那怎么整?

我们只需将 \(a\) 还没用满的时候,后面加个 \(b\) , \(a\) 用满后,在加 \(aaaaa \dots b\) .

那这个逆天长串答案怎么统计?

设原串中 \(a\) 有 \(x\) 个,显然答案为:

\[\begin{aligned} &= dp_{i , j} \times \left(\sum{p_b p_a^i \times (i + x)} \right) \\ &= dp_{i , j} \times \left(\frac{x p_b}{1 - p_a} + \frac{p_a + p_b}{(1 - p_a)^2}\right) \end{aligned}\]

做完啦!!!

code

CODE
#include <bits/stdc++.h>
using namespace std ; 
typedef long long ll ; 
const int N = 1e3 + 10 ; 
const int mod = 1e9 + 7 ; 

ll k , p11 , p22 , p1 , p2 , dp[N][N] ; 

inline ll Quick_Pow(ll a , ll b) {
	ll ans = 1 ; 

	while (b) {
		if (b & 1) ans = (ans * a) % mod ; 
		b >>= 1 , a = (a * a) % mod ; 
	}

	return ans ; 
}

ll ans = 0 ; 

signed main() {
	ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ; 
	cin >> k >> p11 >> p22 ; 

	p1 = (p11 * Quick_Pow(p11 + p22 , mod - 2)) % mod , p2 = (p22 * Quick_Pow(p11 + p22 , mod - 2)) % mod ; 
	dp[0][0] = 1 ; 

	for (int i = 1 ; i <= k ; ++ i) {
		for (int j = 0 ; j < k ; ++ j) {
			dp[i][j] = (dp[i - 1][j] * p1) % mod ; 

			if (j >= i) dp[i][j] = (dp[i][j] + dp[i][j - i] * p2 % mod) % mod ; 
			if (i != k && i + j >= k) ans = (ans + (((dp[i][j] * p2) % mod) * ((1ll * i + j) % mod))) % mod ; 
		}
	}

	ll sum1 , sum2 , ny ; 

	for (int i = 0 ; i < k ; ++ i) {
		ny = Quick_Pow((1 - p1 + mod) % mod , mod - 2) ; 
		sum1 = ((k * p2) % mod * ny) % mod , sum2 = (((p1 * p2) % mod) * ((ny * ny) % mod)) % mod ; 
		ans = (ans + (dp[k][i] * (sum1 + sum2 + i)) % mod) % mod ; 
	}

	ans = (ans * Quick_Pow((1 + mod - p2) % mod , mod - 2)) % mod ; 
	cout << ans ; 
}

标签:p2,ll,Arbitrary,Arrangement,p11,ans,New,dp,mod
From: https://www.cnblogs.com/hangry/p/18462085

相关文章

  • NewStar CTF[pwn] overwrite WriteUp
    IDA打开,查看func()函数,得到以下代码点击查看代码unsigned__int64func(){size_tinput1[6];//[rsp+Ch][rbp-84h]BYREFcharnptr[72];//[rsp+40h][rbp-50h]BYREFunsigned__int64v3;//[rsp+88h][rbp-8h]v3=__readfsqword(0x28u);printf("plsin......
  • python __new__和__init__的区别
    简介__new__和__init__都是Python中的特殊方法,它们在对象生命周期中起到不同的作用。用法1、__new__方法:__new__是一个静态方法,用于创建一个新的对象实例。当你调用一个类时,__new__方法是第一个被调用的方法。它的主要任务是分配内存空间,并返回一个新创建的对象实例。通常情况......
  • Newtec MDM2510 REST API
    NewtecMDM2510RESTAPI SatOct1214:37:112024<--L10SatOct1214:37:112024<--A15SatOct1214:37:112024<--W15SatOct1214:37:112024<--S172.0000000.0000000.000000SatOct1214:37:112024......
  • NewStar CTF 2024 week1 题解
    1.base题目给了以下内容:Thisisabasequestion!4C4A575851324332474E324547554B494A5A4446513653434E564D444154545A4B354D45454D434E4959345536544B474D5134513D3D3D3D观察给出的字符串发现,字符串由数字0-9以及字母A-F组成,于是推测这可能是一个base16编码,于是将其解码,......
  • Bolt.new平台初体验
    使用http://Bolt.new尝试自然语言编程并部署Bolt.new是StackBlitz推出的一款在线开发沙盒平台,该平台结合了人工智能(AI)和WebContainers技术优点无需复杂配置:Bolt.new允许用户直接通过浏览器访问,无需下载或安装任何软件,也无需进行复杂的本地环境配置。这极大地简化了开发流程,使开......
  • NewStar2024-week1
    前言:刚开始比赛,时间比较多尝试了一下所有题目,难度也很友好,之后就写密码了,写全部太累了Week1CryptoBase4C4A575851324332474E324547554B494A5A4446513653434E564D444154545A4B354D45454D434E4959345536544B474D5134513D3D3D3D秒了一眼秒了p,q相近或者factordb查"""fro......
  • [Javascript] Check whether a function is call with new
    The new.target meta-propertyletsyoudetectwhetherafunctionorconstructorwascalledusingthe new operator.Inconstructorsandfunctionsinvokedusingthe new operator, new.target returnsareferencetotheconstructororfunctionthat new wa......
  • NewStarCtf 2024第一周writeup
    有几道题没写出来,但还是希望能够帮到大家理解更多的CTF知识Signin操作内容:做选择题得出flag。flag值:flag{I_Agr3e_to_FoL10w_th3_ru1es_c41fa97d}MISC兑换码操作内容:题目提示flag在图片下方,010修改图片宽度,得到flag。flag值:flag{La_vaguelette}MISCLabyrinth操......
  • New Phytologist | 红杉的基因组选择:从概念验证到实际应用
    分享一篇最近发表《NewPhytologist》上一篇文章:Genomicselectioninwesternredcedar:fromproofofconcepttooperationalapplication。文章主要研究了基因组选择(GS)在西部红杉(westernredcedar,WRC,即Thujaplicata)中的应用,从概念验证到实际操作的全过程。研究背景森林......
  • School New Competition WP
    试验一下博客园的基础功能,顺便把学校战队招新赛的Wp传一下,alpaca_search:直接burp爆破把密码搞出来,在burp多抓几次包会在正确的包里发现一个新的cookie名count,count记录了正确的值,然后把它改成999再多发几次包,发到正确的那一个后就拿到了flagRCE_ME!!!题目直接说明了是RCE,根据......