組合數學 「派送食物問題」

2021-06-29 12:14:22 字數 2882 閱讀 7574

問題描述

lucy 和lily 是一對雙胞胎,在lucy 和lily 十歲生日的時候,她們舉辦了乙個晚會。晚會上,tom 負責派送食物。tom 手上有兩種食物,漢堡和三明治。晚會上的20 個孩子圍成一圈,tom 拿了10 個漢堡和10 個三明治,進行分發。為了保證公平,tom 採用丟硬幣的方法,正面給漢堡,背面給三明治。lucy 和lily 被按排到最後再拿食物,但當tom 發到第19 個人lucy 的時候,這時候只有兩個漢堡了,於是他不再丟硬幣了,讓最後兩個人都拿漢堡。lucy 和lily 因此都拿了漢堡。

對此,tom 很好奇,他非常想知道當n(n 為偶數)個人圍成一圈的時候,分發n/2 個

漢堡,n/2 個三明治,lucy 和lily 最後兩個拿食物,她們拿到同樣食物的概率。

資料輸入

第一行整數k,測試資料的組數,接下來k 行,每行乙個偶整數n。其中,n 的取值範圍是[2,4,6…100000]。

資料輸出

對於每組測試資料,輸出lucy 和lily 拿到同樣食物的概率。輸出四捨五入保留3 位有

效數字。

樣例輸入輸出

樣例輸入3 6

10256

樣例輸出

0.625

0.727

0.950

資料說明

30%的測試資料n 的取值範圍小於50。

70%的測試資料n 的取值範圍小於等於1000。

100%的測試資料n 的取值範圍小於等於100000。

這完全就是一道數學題啊。。。由於我十分愚鈍,絲毫不會。。。

我們先把題解發出來

所以最後兩個數不同的概率是c(n-2,n/2-1)*(1/2)^(n-2)。

因此,最後兩個數相同的概率就是

1- c(n-2,(n/2-1)*(1/2)^(n-2)。

由於n實在太大了,在計算的時候要注意乘法和除法的結合,既要避免浮點數溢位,又要避免精度降到0之下。

上來那個「所以」弄得我莫名其妙,不知道這式子怎麼蹦出來的(當然神犇們一看題一眼就會了)。下面給出我愚蠢的過程。

我先敲了如下的模擬(數學課本上說,不好算的概率,可以用計算機模擬)

var

a,b,tot,i,c,n:longint;

begin

randomize;

tot:=10000000;

c:=0;

n:=10;

for tot:=1

to tot do

begin

a:=n>>1;b:=n>>1;

for i:=1

to n-2

doif random(2)=1

then dec(a) else dec(b);

if (a<=0)or(b<=0) then inc(c);

//if (a=0)or(b=0) then inc(c);

end;

writeln(c/tot:0:3);

end.

這個模擬充斥著我迂腐的思想。。。我在注釋的那一行糾結了很長時間,後來覺得就是小於等於零,而不是等於零,因為小於零對應著某一種「提前取完」。(其實把樣例輸進去看下就知道了「)。

通過這個模擬我們發現符合要求的情況就是n-2個數,每個可以取0或1,取得大於等於n/2個0或1。

這樣就和題解上的一樣了,就剩下」由於n實在太大了,在計算的時候要注意乘法和除法的結合,既要避免浮點數溢位,又要避免精度降到0之下」的處理,我又用了愚蠢的方法,把組合數定義裡的所有分子分母存起來,先乘法,太大之後做除法。

var

t,n:longint;

x,y:array[0..300000]of longint;

function

calc

(n:longint):extended;

var i,j,a,b:longint;ans:extended;

begin

b:=n-2;

for i:=1

to b do y[i]:=2;

a:=n>>1-1;

for i:=1

to a do

begin

x[i]:=n-1-i;

inc(b);

y[b]:=i;

end;

ans:=1;

i:=1;

j:=1;

//for i:=1 to b do write(y[i],' ');

while i<=a do

begin

ans:=ans*x[i];

while (ans>1e15)and(j<=b) do

begin ans:=ans/y[j];inc(j);end;

inc(i);

end;

while j<=b do

begin

ans:=ans/y[j];

inc(j);

end;

exit(1-ans);

end;

begin

assign(input,'food.in');reset(input);

assign(output,'food.out');rewrite(output);

readln(t);

for t:=1

to t do

begin

read(n);

writeln(calc(n):0:3);

end;

close(input);close(output);

end.

組合數學問題

監獄有連續編號為1.n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 輸入兩個整數m,n.1 m 10 8,1 n 10 12 可能越獄的狀態數,模100003取餘 6種狀態為 000 001 011 ...

組合數學 購票問題

購票問題 題目大意 一張票50元,有n個帶著50元的人和n個帶著100元的人,請問總共有多少種排隊方法使得不會出現購票找不回錢的尷尬局面?輸入樣例 2 輸出樣例 2 這是一類非常有代表性的問題,下面將介紹該問題的5種解法 number 5 暴力列舉 很顯然,要使帶著100元的購票那麼就需要50的去找...

組合數學 求組合數

對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...