彩色圆环
金牌导航 期望-5
题目大意
给你一个环,每个位置的数字等概率为1~m中的其中一个,对于连续的相同数字的串,记其长度为aia_iai,求aia_iai的积的期望值
输入样例
8 1
输出样例
8.00000
数据范围
1⩽N⩽200,1⩽M⩽1091\leqslant N \leqslant 200,1\leqslant M \leqslant 10^91⩽N⩽200,1⩽M⩽109
解题思路
先预处理出出现连续x个相同数字的概率,记为prob
然后设fi,1/0f_{i,1/0}fi,1/0为前i个数中,第i个数和式子首尾相接的数相同/不同的期望值
那么有
fi,0+=fj,0×probi−j×(i−j)×m−2mfi,0+=fj,1×probi−j×(i−j)×m−1mfi,1+=fj,0×probi−j×(i−j)×1m\begin{aligned}f_{i,0} &+= f_{j,0} \times prob_{i - j} \times (i - j) \times \frac{m-2}{m}\\f_{i,0} &+= f_{j,1} \times prob_{i - j} \times (i - j) \times \frac{m-1}{m}\\f_{i,1} &+= f_{j,0} \times prob_{i - j} \times (i - j) \times \frac{1}{m}\end{aligned}fi,0fi,0fi,1+=fj,0×probi−j×(i−j)×mm−2+=fj,1×probi−j×(i−j)×mm−1+=fj,0×probi−j×(i−j)×m1
i-j+1为贡献值
第一行是既要不等于上一个又不等于收尾相接的
第二行是既要不等于上一个即可(因为首尾相接的和上一个相等)
第三行要和首尾相接的相等
最后处理一下首尾相接部分即可(详情见代码)
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n;
double m, ans, prob[210], f[210][2];
int main()
{scanf("%d%lf", &n, &m);prob[1] = 1;f[0][1] = 1;for (int i = 2; i <= n; ++i)prob[i] = prob[i - 1] / m;//求概率for (int i = 1; i <= n; ++i)for(int j = 0; j < i; ++j){f[i][0] += f[j][0] * prob[i - j] * (i - j) * (m - 2) / m;f[i][0] += f[j][1] * prob[i - j] * (i - j) * (m - 1) / m;f[i][1] += f[j][0] * prob[i - j] * (i - j) / m;}ans = n * prob[n];for (int i = 1; i < n; ++i)ans += f[i][0] * prob[n - i] * (n - i) * (n - i);//首尾相接的,以保证不相等,不用除,第一个(n-i)为贡献,第二个为把最后面的移到前面的方案数printf("%.5lf", ans);return 0;
}