正解:類數字dp,統計二進位制下0和一的個數,blablabla。。。具體不懂,要再問問,懂了再更。
我們可以考慮二進位制:
可以想到,將每一位分別求出,在統計起來就可以了。
var n,m,tot0,tot1:int64;
i,j,l,k:longint;
ans1,ans2,ans3:int64;
a:array[1..100000] of longint;
b:array[1..100000,0..31] of longint;
e:array[0..30] of int64;
f,d,g:array[-1..100000] of int64;
procedure
zh(x,y:longint);
var i,j:longint;
begin
b[x,0]:=1;
b[x,1]:=y;
while b[x,b[x,0]]>1
dobegin
b[x,b[x,0]+1]:=b[x,b[x,0]] div
2; b[x,b[x,0]]:=b[x,b[x,0]] mod
2; inc(b[x,0]);
end;
end;
procedure
jianyu
();var i:longint;
begin
for i:=1
to n do
begin
ans1:=ans1-a[i];
ans2:=ans2-a[i];
ans3:=ans3-a[i];
end;
end;
procedure
erjinzhi
();var i:longint;
begin
e[0]:=1;
for i:=1
to30
do e[i]:=e[i-1]*2;
end;
procedure
shuchu
();begin
write(ans1/n/n:0:3);
write(' ');
write(ans2/n/n:0:3);
write(' ');
writeln(ans3/n/n:0:3);
end;
begin
readln(n);
for i:=1
to n do
begin
read(a[i]);
zh(i,a[i]);
if b[i,0]>m then m:=b[i,0];
end;
erjinzhi();
for j:=1
to m do
begin
tot0:=0;
tot1:=0;
for i:=1
to n do
begin
if b[i,j]=0
then
begin
f[i]:=f[i-1];
g[i]:=0;
d[i]:=tot1;
tot0:=i;
endelse
begin
f[i]:=f[tot1-1]+i-tot1;
g[i]:=i-tot0;
d[i]:=i;
tot1:=i;
end;
ans1:=ans1+f[i]*e[j];
ans2:=ans2+g[i]*e[j];
ans3:=ans3+d[i]*e[j];
end;
end;
jianyu();
shuchu();
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個不合法的空的方案數。這裡的空指...