正解:类数位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 .