【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; }