正解:类数位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 do
begin
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 to 30 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;
end
else
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.