【BZOJ2969】矩形粉刷 概率+容斥
阿新 • • 發佈:2017-09-17
zoj str using -i 需要 int scrip stream 新的
【樣例解釋】
準確答案約為3.57
【範圍】
100% 的數據滿足:1 ≤ W, H ≤ 1000, 0 ≤ K ≤ 100
【BZOJ2969】矩形粉刷
Description
為了慶祝新的一年到來,小M決定要粉刷一個大木板。大木板實際上是一個W*H的方陣。小M得到了一個神奇的工具,這個工具只需要指定方陣中兩個格子,就可以把這兩格子為對角的,平行於木板邊界的一個子矩形全部刷好。小M樂壞了,於是開始胡亂地使用這個工具。 假設小M每次選的兩個格子都是完全隨機的(方陣中每個格子被選中的概率是相等的),而且小M使用了K次工具,求木板上被小M粉刷過的格子個數的期望值是多少。Input
第一行是整數K,W,HOutput
一行,為答案,四舍五入保留到整數。Sample Input
1 3 3Sample 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】矩形粉刷 概率+容斥