【bzoj2698】染色 期望

题目描述

输入

输入一行四个整数,分别为N、M、S和T。

输出

输出一行为期望值,保留3位小数。

样例输入

5 1 2 3

样例输出

2.429


题解

期望

由于期望在任何时候都是可加的,因此只要算出每个格子被染色的概率,加起来即为答案。

单次染色一个格子不被染的概率为 不经过它的区间个数/总区间个数 ,这个可以分左右部分加起来求。

然而貌似只有我丧心病狂的写了分类讨论= =

对于每个概率快速幂一下即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long double ld;
ld pow(ld x , int y)
{
	ld ans = 1;
	while(y)
	{
		if(y & 1) ans = ans * x;
		x = x * x , y >>= 1;
	}
	return ans;
}
int main()
{
	int n , m , s , t , l , r , i;
	ld ans = 0 , a , c;
	scanf("%d%d%d%d" , &n , &m , &s , &t) , a = (ld)(2 * n + 2 - s - t) * (t - s + 1) / 2;
	for(i = 1 ; i <= n ; i ++ )
	{
		l = i , r = n - i + 1;
		if(l >= t)
		{
			if(r >= t) c = (ld)(s + t) * (t - s + 1) / 2;
			else if(r >= s) c = (ld)r * (t - r) + (ld)(s + r) * (r - s + 1) / 2;
			else c = (ld)r * (t - s + 1);
		}
		else if(l >= s) 
		{
			if(r >= t) c = (ld)l * (t - l) + (ld)(s + l) * (l - s + 1) / 2;
			else if(r >= s)
			{
				if(l >= r) c = (ld)(l + 2 * r - t) * (t - l + 1) / 2 + (ld)r * (l - r) + (ld)(s + r - 1) * (r - s) / 2;
				else c = (ld)(r + 2 * l - t) * (t - r + 1) / 2 + (ld)l * (r - l) + (ld)(s + l - 1) * (l - s) / 2;
			}
			else c = (ld)(l + 2 * r - t) * (t - l + 1) / 2 + (ld)r * (l - s);
		}
		else
		{
			if(r >= t) c = (ld)l * (t - s + 1);
			else if(r >= s) c = (ld)(2 * l + r - t) * (t - r + 1) / 2 + (ld)l * (r - s);
			else c = (ld)(2 * l + 2 * r - s - t) * (t - s + 1) / 2;
		}
		ans += 1 - pow(1 - c / a , m);
	}
	printf("%.3Lf" , ans);
	return 0;
}

 

原文地址:https://www.cnblogs.com/GXZlegend/p/7391547.html