题面:https://ac.nowcoder.com/acm/contest/33189/N
分析:
直接算会超long long,所以要减小计算量
可以发现(a&b)+(a|b)=a+b;
例如: 当a=
100
1
2
1001_2
10012,b=
110
1
2
1101_2
11012时
a&b=
100
1
2
1001_2
10012 a|b=
110
1
2
1101_2
11012
所以(a&b)+(a|b)=a+b 也可说
1
2
1_2
12下沉了
故可以先把所有
1
2
1_2
12下沉,减小计算量(见代码)
接下来,考虑方差
因为
D
(
x
)
=
E
(
x
2
)
−
E
2
(
x
)
D(x)=E(x^2)-E^2(x)
D(x)=E(x2)−E2(x)
E
(
x
)
=
1
n
∑
i
=
1
n
x
E(x)=\frac{1}{n}\sum^n_{i=1}x
E(x)=n1i=1∑nx
即求平均数
代码:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MXN=1e5+7;
int a[MXN];
int b[47],c[MXN];
long long gcd(long long x,long long y){
if(x%y==0) return y;
return gcd(y,x%y);
}
int main(){
ios::sync_with_stdio(false);
int n,t,maxlen,id,i,nn;
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
t=0;
while(a[i]){
t++;
b[t]+=(a[i]&1);
maxlen=max(maxlen,t);
a[i]>>=1;
}
}
for(i=1;i<=maxlen;i++){
id=1;
while(b[i]){
c[id]|=(1<<(i-1));
id++;
nn=max(nn,id);
b[i]--;
}
}
long long k1=0,k2=0;
for(i=1;i<=nn;i++){
k1=k1+c[i]*c[i]; k2=k2+c[i];
}
long long res=k1*1ll*n-k2*k2;
cout<<res/gcd(res,1ll*n*n)<<"/"<<1ll*n*1ll*n/gcd(res,1ll*n*n)<<"\n";
}