問題描述
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 ...