• 【YBTOJ】【国家集训队】彩色圆环


    彩色圆环:

    题目大意:

    一个环上有 (n) 个点,每个点随机染为 (m) 种颜色之一。求环上同色连续段长度之积的期望值。

    思路:

    破环为链,就有 (f_{i,[0,1]}) 表示到第 (i) 个数,环首尾是否同种颜色的期望值。则有:

    [egin{aligned} f_{i,1}&=sum_{j=0}^{i-1} frac{p_{i-j}cdot f_{j,0} cdot (i - j)}{m}\ f_{i,0}&=sum_{j=0}^{i-1} p_{i-j}cdot (i - j)left(frac{(m-2)f_{i,0}}{m} + frac{(m-1)f_{i,1}}{m} ight) end{aligned}]

    其中 (p_i=m^{-i}),即连续 (i) 个相同颜色的概率。

    代码:

    const int N = 210;
    
    inline ll Read()
    {
    	ll x = 0, f = 1;
    	char c = getchar();
    	while (c != '-' && (c < '0' || c > '9')) c = getchar();
    	if (c == '-') f = -f, c = getchar();
    	while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
    	return x * f;
    }
    
    double f[N][2], p[N], ans, m;
    int n; 
    
    int main()
    {
    	n = Read(); scanf ("%lf", &m);
    	p[1] = 1.0;
    	m = 1.0 / m;
    	for (int i = 2; i <= n; i++)
    		p[i] = p[i - 1] * m;
    	f[0][1] = 1.0;
    	for (int i = 1; i <= n; i++)
    		for (int j = 0; j < i; j++)
    			f[i][1] += p[i - j] * (i - j) * f[j][0] * m,
    			f[i][0] += p[i - j] * (i - j) * (f[j][0] * (1 - 2 * m) + f[j][1] * (1 - m));
    	double ans = p[n] * n;
    	for (int i = 1; i < n; i++)
    		ans += 1.0 * i * i * f[n - i][0] * p[i];  //处理首尾不相接
    	printf ("%.10lf
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    C#写文本文件,如何换行(添加换行符)
    C#使用oledb操作excel文件的方法
    winform之combobox
    vs2010快捷键
    可以下载一些书籍代码的网站
    对php和java里面的static函数和static的一些理解
    10.4-CMake find 模块
    6.25-Git 技巧
    6.4-Git Command
    2.25-CMake Tutorial
  • 原文地址:https://www.cnblogs.com/GJY-JURUO/p/15017711.html
Copyright © 2020-2023  润新知