彩色圆环
题目链接: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}
mm−1。(记得乘上连在一起的个数和构成这么多个连在一起的概率)
一开始是
0
0
0,那就是原来首尾不同,现在还是首尾不同。那根据选不跟开头和不跟结尾一样的颜色的这个东西,我们就有两个颜色是选不了的,那选到的概率就是
m
−
2
m
\dfrac{m-2}{m}
mm−2。(记得乘上连在一起的个数和构成这么多个连在一起的概率)
但是这个是一个环,那我们就看头和尾连在一起之后有多少个连在一起的新出现。
那我们就枚举这个东西,然后看对答案的贡献。(不过我是枚举剩下的长度,但是原理一样)
首先,剩下的期望是
f
n
−
i
,
0
f_{n-i,0}
fn−i,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;
}