"蔚来杯"2022牛客暑期多校训练营4-N-Particle Arts
原题题面:https://ac.nowcoder.com/acm/contest/33189/N
题目大意
空间中有
n
(
2
≤
n
≤
1
0
5
)
n(2\le n\le 10^5)
n(2≤n≤105)个点,每个点具有热量
a
i
(
0
≤
a
i
≤
2
15
)
a_i(0\le a_i\le2^{15})
ai(0≤ai≤215)焦耳,每两个点可能随机碰撞,如果两个带有能量
a
a
a焦耳与
b
b
b焦耳的粒子碰撞,将形成
a
∣
b
a|b
a∣b焦耳与
a
a
a&
b
b
b焦耳
两个能量的粒子。
已证这
n
n
n个粒子的能量方差终会收敛,求最终收敛的方差。
求方差公式如下:
σ
2
=
1
n
∑
i
=
1
n
(
x
i
−
μ
)
2
σ ^2=\frac{1}{n}\sum_{i=1}^n(x_i-\mu)^2
σ2=n1i=1∑n(xi−μ)2
而
μ
=
1
n
∑
i
=
1
n
x
i
\mu=\frac{1}{n}\sum_{i=1}^nx_i
μ=n1i=1∑nxi
最终结果以
a
/
b
a/b
a/b的最简分数形式输出(当
a
=
0
a=0
a=0时,
b
=
1
b=1
b=1)。
解题思路
发现两粒子碰撞后,二进制位为
1
1
1的趋向于能量为
a
∣
b
a|b
a∣b的粒子,二进制位为
0
0
0的趋向于能量为
a
&
b
a\&b
a&b的粒子,经过有限次碰撞,
1
1
1不断进入最大能量的粒子,
0
0
0不断进入携带较小能量的粒子
如图:
1
0
1
1
0
0
1
1
0
1
0
0
1
0
1
1
0
0
0
1
\begin{array}{} 1&0&1&1&\\ 0&0&1&1\\ 0&1&0&0\\ 1&0&1&1\\ 0&0&0&1 \end{array}
10010001001101011011
变为:
0
0
0
0
0
0
0
1
0
0
1
1
1
0
1
1
1
1
1
1
\begin{array}{} 0&0&0&0&\\ 0&0&0&1\\ 0&0&1&1\\ 1&0&1&1\\ 1&1&1&1 \end{array}
00011000010011101111
显然,只有任意两个粒子二进制都具有包含关系,碰撞时才不会使二进制位交换,此时能量值的方差收敛。
代码实现
代码只需构造出如上关系即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
ll n,a[N],b[100],m;
ll gcd(ll a,ll b){
if(a%b==0)return b;
return gcd(b,a%b);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
ll t=0;
while(a[i]){
t++;
b[t]+=a[i]&1;
m=max(m,t);
a[i]>>=1;
}
}
for(int i=1;i<=m;i++){
while(b[i]){
a[b[i]]|=1<<i-1;
b[i]--;
}
}
ll a1=0,a2=0;
for(int i=1;i<=n;i++){
a1+=a[i]*a[i],a2+=a[i];
}
ll ans=a1*n-a2*a2;
cout<<ans/gcd(ans,n*n)<<'/'<<n*n/gcd(ans,n*n);
}
另
末尾所用公式为:
设一个数组的 方差为 D ( x ) ,平均数为 E ( x ) 。 则 D ( x ) = E ( x 2 ) − E 2 ( x ) 证明: D ( x ) = 1 n ∑ i = 1 n ( x i − E ( x ) ) 2 展开可得 D ( x ) = 1 n ∑ i = 1 n ( x i 2 − 2 x i E ( x ) + E 2 ( x ) ) = 1 n × n × E 2 ( x ) + 1 n × ∑ i = 1 n ( x i 2 − 2 x i E ( x ) ) = E 2 ( x ) + 1 n × ∑ i = 1 n ( x i 2 − 2 x i E ( x ) ) = E 2 ( x ) + E ( x 2 ) − 1 n × ∑ i = 1 n 2 x i E ( x ) = E 2 ( x ) + E ( x 2 ) − 2 × E 2 ( x ) = E ( x 2 ) − E 2 ( x ) 证毕。 \begin{aligned} 设一个数组的&方差为D(x),平均数为E(x)。\\ 则D(x)&=E(x^2)-E^2(x)\\ 证明:D(x)&=\frac{1}{n}\sum_{i=1}^n(x_i-E(x))^2\\ 展开可得D(x)&=\frac{1}{n}\sum_{i=1}^n(x_i^2-2x_iE(x)+E^2(x))\\ &=\frac{1}{n}\times n\times E^2(x)+\frac{1}{n}\times \sum_{i=1}^n(x_i^2-2x_iE(x))\\ &= E^2(x)+\frac{1}{n}\times \sum_{i=1}^n(x_i^2-2x_iE(x))\\ &=E^2(x)+E(x^2)-\frac{1}{n}\times\sum_{i=1}^n2x_iE(x)\\ &=E^2(x)+E(x^2)-2\times E^2(x)\\ &=E(x^2)-E^2(x)\\ &证毕。 \end{aligned} 设一个数组的则D(x)证明:D(x)展开可得D(x)方差为D(x),平均数为E(x)。=E(x2)−E2(x)=n1i=1∑n(xi−E(x))2=n1i=1∑n(xi2−2xiE(x)+E2(x))=n1×n×E2(x)+n1×i=1∑n(xi2−2xiE(x))=E2(x)+n1×i=1∑n(xi2−2xiE(x))=E2(x)+E(x2)−n1×i=1∑n2xiE(x)=E2(x)+E(x2)−2×E2(x)=E(x2)−E2(x)证毕。