time limits: 1000 ms memory limits: 131072 kb special judge
description
freda發明了傳呼機之後, rainbow 進一步改了傳呼機傳送資訊所使用的號。 由於現在是數字、資訊時代, rainbow 發明的訊號用 n個自然數表示。 為了避免兩個人的對話被 大壞蛋 variantf偷聽 t_t,rainbow 把對話分成 對話分成a、b、c三部分 ,分別用 a、b、c三個密碼 加密 。現在 freda接到了 rainbow的資訊,她首要工作就是解密。 freda了解到,這三部 分的密碼計算方式如下:
在 1~n這 n個數 中,等概率地選取兩個數l、r,如果 l>r,則交換 l、r。把訊號中的第 l個數到第 r個數 取出來,構成一數列 p。
input第一行 乙個正整數 n。
第二行 n個自然數,表示 freda接到的訊號 。
output
一行三個實數, 分別表示 xor 和、 and 和、 or 和的期望 ,四捨五入保留 3位小數, 相鄰 兩個 實數之間用不少於乙個空格隔開 。三個實數分別占該 測試點 40% 、30% 、30% 的分數, 如果你的輸出少於三個實數 ,或者 你的輸出不合法,將被判 0分。
sample input
input1:
2 4 5
input2:
3 1 0 1
sample output
output1:
2.750 4.250 4.750
output2:
0.667 0.222 0.889
data constraint
對於 20% 的資料, 1<=n<=100
對於 40% 的資料, 1<=n<=1000
對於另外 30% 的資料, n個數為 0或 1
對於 100% 的資料, 1<=n<=100000 ,n個自然數均不超過 10^9
hint
l,rxorand
or1,144
41,214
52,114
52,255
5 以上l,r出現概率均相同,因此分別對xor和,and和,or和求平均數就是數學期望值。
給出n個數,num1 num2 num3……numn
給出 a(i,j) b(i,j) c(i,j) 分別表示從i到j的異或和,and和還有or和。
如果i>j,則 a(i,j)=a(j,i) b(i,j)=b(j,i) c(i,j)=c(j,i)
如果i=j,則 a(i,j)=b(i,j)=c(i,j)=numi 求:∑
ni=1
∑nj=
1a(i
,j)n
2 ∑n
i=1∑
nj=1
b(i,
j)n2
∑ni=1∑n
j=1c
(i,j
)n2
我們可以考慮二進位制:
可以想到,將每一位分別求出,在統計起來就可以了。
對於每一位,只有0和1,為了方便理解和講解,這裡用三個陣列:
fi,表示∑n
j=1a
(j,i
) gi,表示∑n
j=1b
(j,i
) di,表示∑n
j=1c
(j,i
)
那麼每一位的答案就是 1.2
∑ni=
1fi−
∑ni=
1num
in2
2.2∑n
i=1g
i−∑n
i=1n
umin
2 3.2
∑ni=
1di−
∑ni=
1num
in2
在統計總答案時,第i位的答案要乘以2i
−1
對於求出fi,gi,di。我們先用near1,near0分別表示,不包括當前位,最近的1,0的位置
那麼 fi=f[near1-1]+i-near1 (當前位為1) f[i-1] (當前位為0)
gi=i-near0 (當前位為1) 0 (當前位為0)
di=i (當前位為1) near1 (當前位為0)
codes
var n,i,j,max,nea1,nea0:longint;
ans1,ans2,ans3:real;
num:array[1..100000]of longint;
two:array[0..30]of longint;
bit:array[1..100000,0..31]of shortint;
f,d,g:array[-1..100000]of int64;
procedure
doit
(w,n:longint);
begin
while n>0
dobegin
inc(bit[w,0]);
bit[w,bit[w,0]]:=n mod
2; n:=n shr
1; end;
end;
begin
read(n);
for i:=1
to n do
begin
read(num[i]);
doit(i,num[i]); //轉為二進位制
if bit[i,0]>max then max:=bit[i,0];
end;
two[0]:=1;
for i:=1
to30
do two[i]:=two[i-1]*2;
for j:=1
to max do
begin
nea0:=0; nea1:=0;
for i:=1
to n do
begin
if bit[i,j]=0
then
//當位為0的情況
begin
f[i]:=f[i-1];
g[i]:=0;
d[i]:=nea1;
nea0:=i;
endelse
begin
//當位為1情況
f[i]:=f[nea1-1]+i-nea1;
g[i]:=i-nea0;
d[i]:=i;
nea1:=i;
end;
ans1:=ans1+f[i]*two[j]; //計入答案
ans2:=ans2+g[i]*two[j];
ans3:=ans3+d[i]*two[j];
end;
end;
for i:=1
to n do
begin
ans1:=ans1-num[i]; //減去多餘部分
ans2:=ans2-num[i];
ans3:=ans3-num[i];
end;
writeln(ans1/n/n:0:3,' ',ans2/n/n:0:3,' ',ans3/n/n:0:3); //求期望,注意,不能/sqr(n) 否則會爆
end.
模擬 NOIP 2013 花匠
花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...
NOI(P)2013模擬 秘密任務
這題是在最短路上研究問題的,所以理所當然要建個圖先。其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。其實這兩題是不同的。所以我在考試時就掛了。因為...
NOIP2013模擬 粉刷匠
給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的 有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。k 15,ci 6,資料組數 2000 這種題一般很難有直接的通式,可以考慮dp。設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。這裡的空指...