1. 程式人生 > >【BZOJ2969】矩形粉刷 概率+容斥

【BZOJ2969】矩形粉刷 概率+容斥

zoj str using -i 需要 int scrip stream 新的

【BZOJ2969】矩形粉刷

Description

為了慶祝新的一年到來,小M決定要粉刷一個大木板。大木板實際上是一個W*H的方陣。小M得到了一個神奇的工具,這個工具只需要指定方陣中兩個格子,就可以把這兩格子為對角的,平行於木板邊界的一個子矩形全部刷好。小M樂壞了,於是開始胡亂地使用這個工具。 假設小M每次選的兩個格子都是完全隨機的(方陣中每個格子被選中的概率是相等的),而且小M使用了K次工具,求木板上被小M粉刷過的格子個數的期望值是多少。

Input

第一行是整數KWH

Output

一行,為答案,四舍五入保留到整數。

Sample Input

1 3 3

Sample Output

4
【樣例解釋】
準確答案約為3.57
【範圍】
100% 的數據滿足:1 ≤ W, H ≤ 1000, 0 ≤ K ≤ 100

題解:跟染色那題一樣,由於期望可加,所以我們只需要統計每個點被刷到的概率。而每個點被刷到的概率=1-每個點沒被刷到的概率,沒被刷到的怎麽算呢?維護個二位前綴和,然後容斥搞一搞就行了。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
int K,W,H;
double ans;
double pm(double x,int y)
{
	double ret=1;
	while(y)
	{
		if(y&1)	ret=ret*x;
		x=x*x,y>>=1;
	}
	return ret;
}
inline ll c(ll x)
{
	return x*x;
}
int main()
{
	int i,j;
	scanf("%d%d%d",&K,&W,&H);
	for(i=1;i<=W;i++)
	{
		for(j=1;j<=H;j++)
		{
			ans+=pm((double)(c((i-1)*H)+c((j-1)*W)+c((W-i)*H)+c(W*(H-j))-c((i-1)*(j-1))-c((i-1)*(H-j))-c((W-i)*(j-1))-c((W-i)*(H-j)))/c(W*H),K);
		}
	}
	printf("%.0lf",W*H-ans);
	return 0;
}

【BZOJ2969】矩形粉刷 概率+容斥