JZOJ 3871 無聊的遊戲

2021-07-26 04:35:39 字數 1141 閱讀 2339

學校的運動會開始了,體能很菜的小可可沒報任何比賽專案,於是和同學們玩乙個十分無聊的遊戲。

遊戲在乙個由n*n個方格組成的正方形棋盤上進行,首先在每個方格上均勻隨機地填入1到m之間的正整數(每個方格填的數均不同),然後小可可均勻隨機地選出k個1到m的數字(可能選的數不在棋盤上),把它們出現在棋盤上的方格塗黑,設有r行被整行塗黑,有c列被整列塗黑,小可可便可以得到2^(r+c)分。

現在小可可想知道他的期望得分是多少,你能幫助他嗎?

2^(r+c),注意一下就可以發現,這是乙個2n位的二進位制數的全部子集

還有,題目所謂的填數,其實並沒有什麼用,

很顯然最後的答案就等於所有的權值和/總方案數,

而總方案數=ck

m , 設g

r,c ,r,c是兩個集合,表示它的子集的個數, 設f

r,c ,r,c是兩個集合,表示有多少種選數的方案可以達到有r,c這兩個集合的狀態, an

s=∑f

r,c∗

gr,c

ckm

把最後除的數先不管,

顯然,f和g的值只與r和c中為1的個數有關,

轉化一下,只要計算gr

,c和fr,

c (有r列、c行是滿的)即可

再轉化一下,計算每乙個r,c在答案中被計算了多少次,發現f,g其實可以合併: an

s=∑r

=0n∑

c=0n

crnc

cn∗c

k−tm

−tt表示一定要選t個才能達到r,c這個狀態,最後一項恰好包含了f,g這兩個,

ps:本題可以用c++的double跑過,不要問我為什麼。

#include 

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

using

namespace

std;

typedef

long

double db;

const

int n=1e5+50;

int m,n,k;

db c[350],ans,d[n];

int main()

A 無聊的遊戲

應該是博弈論 但我還沒學 這題有點水。n m a b 1 n是m的倍數 那麼這種情況下取的人贏了 2 接下來我們考慮一下走到哪部就穩操勝券了 首先你必須取 m個或者大於m並且是m的倍數,那麼我們考慮2m個特殊邊界,n 2m 舉個例子n 2.5m 我只要取到1.5m 換你取 1.5m m 你必須要取m...

JZOJ 1752 無聊的草稿

圖中有n個點,每兩點間只有唯一的路徑,對於這樣乙個給定的圖,最大的 毛毛蟲 會有多大。毛毛蟲包含一條主鏈,毛毛蟲中的節點,要不在主鏈上,要麼和主鏈上某節點相鄰,如下圖所示有兩隻合法的毛毛蟲,點數越多,毛毛蟲越大。輸入檔案第一行兩個整數n,m n 1000000 接下來m行,每行兩個整數a,b a,b...

WOJ1419 無聊的遊戲

xay和amr是兩個很無聊的人,現在他兩又在玩無聊的遊戲。兩個人擁有一摞特殊的牌,每張牌上只有乙個正整數。現在兩人輪流從牌裡按順序翻出一張放在桌上,如果其中乙個人翻出的牌上的數字正好與桌上的另一張牌上的數字相同,那麼他將獲得並拿走這兩張牌之間的所有牌 同時也包括這兩張 現在已知這一摞牌的順序,你知道...