【ybt金牌导航1-1-5】彩色圆环

彩色圆环

题目链接:ybt金牌导航1-1-5

题目大意

有一个环,然后环上同一个颜色连续珠子构成的连续长度的乘积就是它的值。

然后有个长度为 n 的环,然后环上每个点可以随机等概率的生成 m 种颜色的其中一个。

问你这个值的期望。

思路

f i , j f_{i,j} fi,j 为长度为 i i i 的序列,最后一个和第一个的相同性为 j j j 的值期望。.
(就是先不把它弄成环)

那我们枚举最后的连续的个数,然后看看怎么转移。

假设转移到了 j j j 值是 1 1 1 的,那 j j j 一开始就一定要是 0 0 0。(因为你是要加一个跟前面不一样颜色的串,那而前面的最后一个就是跟第一个同一个颜色的,那你已经知道不可能跟第一个同样颜色了)
那我们要从结尾不同转移到结尾相同,就有 1 m \dfrac{1}{m} m1 的几率选到要的颜色,然后记得乘最后连在一起的个数和构成这么多个连在一起的概率。

假设转移到了 j j j 值是 0 0 0 的,那 j j j 一开始 1 1 1 0 0 0 都可以,就分两种情况。

一开始是 1 1 1,那就是有原来的首尾相同变成了首尾不相同。那你要选不跟开头和不跟结尾一样的颜色,但是两个又相同,那就是选到的概率是 m − 1 m \dfrac{m-1}{m} mm1。(记得乘上连在一起的个数和构成这么多个连在一起的概率)
一开始是 0 0 0,那就是原来首尾不同,现在还是首尾不同。那根据选不跟开头和不跟结尾一样的颜色的这个东西,我们就有两个颜色是选不了的,那选到的概率就是 m − 2 m \dfrac{m-2}{m} mm2。(记得乘上连在一起的个数和构成这么多个连在一起的概率)

但是这个是一个环,那我们就看头和尾连在一起之后有多少个连在一起的新出现。
那我们就枚举这个东西,然后看对答案的贡献。(不过我是枚举剩下的长度,但是原理一样)
首先,剩下的期望是 f n − i , 0 f_{n-i,0} fni,0,然后你要构成这个连续的概率要乘上,对答案的贡献 i i i 也要乘上,还有剩下的摆的位置也可以不一样,可以有 i i i 中摆的位置。

然后最后输出答案即可。

代码

#include<cstdio>

using namespace std;

int n, m;
double a[201][2], toge[201], ans;

int main() {
	scanf("%d %d", &n, &m);
	
	toge[0] = toge[1] = 1;
	for (int i = 2; i <= n; i++)
		toge[i] = toge[i - 1] * (1.0 / (1.0 * m));
	//预处理出连续i个同样颜色的概率
	
	a[0][1] = 1;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= i; j++) {
			a[i][0] += a[j - 1][0] * toge[i - j + 1] * (i - j + 1) * (1.0 * (m - 2) / (1.0 * m));
			a[i][0] += a[j - 1][1] * toge[i - j + 1] * (i - j + 1) * (1.0 * (m - 1) / (1.0 * m));
			a[i][1] += a[j - 1][0] * toge[i - j + 1] * (i - j + 1) * (1.0 / (1.0 * m));
		}
	}
	
	ans = n * toge[n];
	for (int i = 1; i < n; i++)
		ans += a[i][0] * toge[n - i] * (n - i) * (n - i);
	//第一个(n - i)是长度要乘积,第二个是中间不同的可以有(n - i)中放法
	
	printf("%.5lf", ans);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值