bzoj2201/ybtoj 彩色圆环

bzoj2201/ybtoj 彩色圆环

题面
ybtoj
这个图片来自@wind_whisper

环上问题,先把环转化成链
设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]
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值