bzoj2201/ybtoj 彩色圆环
环上问题,先把环转化成链
设f[i][0/1]表示:长度为i的、首尾颜色相同/不相同的链 的美观度期望
因为环上问题每一种上的样本点 与 链上问题中的n个样本点 可以互相转化,所以两种情况占据的样本点的比例是一致的,所以两个问题可以如是做等效替换
转移:枚举末尾连续相同颜色块的数量即可
初值:f[1][1]=1
方程:见代码
统计答案:枚举末尾连续同色的长度
code(ybtoj上AC)
#include <bits/stdc++.h>
using namespace std;
#define il inline
#define re register
typedef long long LL;
il int read() {
int s = 0, w = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')
w = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
s = (s << 1) + (s << 3) + c - '0';
c = getchar();
}
return s * w;
}
const int N = 210;
int n, m;
double facP[N], f[N][2], ans;
int main() {
n = read(), m = read();
facP[1] = 1.0;
for (re int i = 2; i <= n; i++) facP[i] = facP[i - 1] / m;
f[1][1] = 1.0;
for (re int i = 2; i <= n; i++) {
for (re int j = 1; j < i; j++) {
f[i][0] += f[j][0] * facP[i - j] * (m - 2) * (i - j) / m;
f[i][0] += f[j][1] * facP[i - j] * (m - 1) * (i - j) / m;
f[i][1] += f[j][0] * facP[i - j] * (i - j) / m;
}
}
// ans=facP[n]*m*n + facP[n-1]*m*(m-1)*(n-1);
ans = n * facP[n];
for (re int i = 2; i <= n; i++) {
ans += f[i][0] * (n - i + 1) * facP[n - i + 1] * (n - i + 1);
//长度为i的两端不同色的链的美观度的期望*新增贡献
//*这种情况发生的概率*这种情况所对应的环上的情况
//包含了多少样本点(枚举的是该颜色在左端占据的长度)
}
printf("%.5lf", ans);
}
/*
200 15
183842.82182
ans+=(n-i+1)*(n-i+1)*f[i][0]*facP[n-i+1]
*/