“蔚来杯“2022牛客暑期多校训练营4-N-Particle Arts

"蔚来杯"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(2n105)个点,每个点具有热量 a i ( 0 ≤ a i ≤ 2 15 ) a_i(0\le a_i\le2^{15}) ai(0ai215)焦耳,每两个点可能随机碰撞,如果两个带有能量 a a a焦耳与 b b b焦耳的粒子碰撞,将形成 a ∣ b a|b ab焦耳与 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=1n(xiμ)2

μ = 1 n ∑ i = 1 n x i \mu=\frac{1}{n}\sum_{i=1}^nx_i μ=n1i=1nxi
最终结果以 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 ab的粒子,二进制位为 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=1n(xiE(x))2=n1i=1n(xi22xiE(x)+E2(x))=n1×n×E2(x)+n1×i=1n(xi22xiE(x))=E2(x)+n1×i=1n(xi22xiE(x))=E2(x)+E(x2)n1×i=1n2xiE(x)=E2(x)+E(x2)2×E2(x)=E(x2)E2(x)证毕。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值