【BZOJ2698】染色 期望

【BZOJ2698】染色

Description

Input

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

Output

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

输入 输出 解释
5 1 2 3 2.429 染色一次共有7种等概率方案(题目描述中提到),其中染2个格子有4种,染3个格子有3种,期望值为2*4/7+3*3/7=2.429。

数据范围
       1 ≤ S ≤ T ≤ N ≤ 1000000,0 ≤ M ≤ 1000000

题解:由于概率可加,所以我们只需要考虑每个位置被染色的概率即可。由于正着求不太容易,我们可以求每个位置不被染色的概率。具体做法:维护个前缀和乱搞即可。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
typedef long double ld;
ll n,m,l,r,tot;
ld ans;
ll s[1000010];
ld pm(ld x,ll y)
{
	ld z=1.0;
	while(y)
	{
		if(y&1)	z=z*x;
		x=x*x,y>>=1;
	}
	return z;
}
int main()
{
	scanf("%lld%lld%lld%lld",&n,&m,&l,&r);
	tot=(n-l+1+n-r+1)*(r-l+1)/2,ans=n;
	ll i;
	for(i=l;i<=n;i++)	s[i]=s[i-1]+min(r-l+1,i-l+1);
	for(i=1;i<=n;i++)	ans-=pm((ld)(s[i-1]+s[n-i])/tot,m);
	printf("%.3lf",(double)ans);
	return 0;
}
posted @ 2017-08-18 19:09  CQzhangyu  阅读(330)  评论(0编辑  收藏  举报