NOIP2013模擬 Rainbow的訊號

2021-07-11 23:17:28 字數 3655 閱讀 9603

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個不合法的空的方案數。這裡的空指...