zoukankan      html  css  js  c++  java
  • alien NOIP模拟 位运算 数论

    ⼩ Y 最近正在接受来⾃ X3 星球的外星⼈的采访。在那个星球上,每个⼈的名字都是⼀个正整数。 所有在这个星球上的居民都是相互认识的。两个这个星球上的⼈的友谊值可以⽤这样来计算: 先把两个⼈ 的名字转换成⼆进制,然后把他们上下对齐排好,如果同⼀列的值相等,那么相应列的值就是 0,否则的 话就是 1,结果最后仍旧转换成⼗进制数。(即 Xor 操作) 例如,两个⼈的名字是 19 和 10,他们的友谊值是 25 这个星球的价值是这么计算的: 所有友情值的和。⼩ Y 邀请你帮助他来计算这个值。

    本题暴力很好打,要思考正解的写法有一定难度。

    因为本题“每个居民的姓名⼩于 106”,所以我们可以考虑在位上面来计算。由于220 = 1048576,大于100000了,所以我们只计算20位即可。

    我们统计每一位上的“1”出现的个数,设为x,那么该位上“0”的出现次数 = n-x,这一位的异或和的“权值”就是 x*(n-x),我们把这一位的“权值”乘以基数(1<<i),就可以得到答案的一部分。我们将各个部分相加就是答案。

    #include<cstdio>
    using namespace std;
    template<class T>inline void read(T &_a)
    {
        char _ch=getchar();_a=0;
        while(_ch<'0'||_ch>'9')_ch=getchar();
        while(_ch>='0'&&_ch<='9'){_a=(_a<<3)+(_a<<1)+_ch-'0';_ch=getchar();}
    }
    
    long long a[21],ans,n;
    
    int main()
    {
        freopen("alien.in","r",stdin);
        freopen("alien.out","w",stdout);
        read(n);
        for (register int i=1,tmp,cnt;i<=n;++i)
        {
            cnt=0;
            read(tmp);
            for (register int v=0;(1<<v)<=tmp;++v)
                if(tmp&(1<<v)) ++a[v];
        }
        for (register int i=0;i<21;++i) ans+=a[i]*(n-a[i])*(1<<i);
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    RocketMQ源码 — 十、 RocketMQ顺序消息
    RocketMQ源码 — 九、 RocketMQ延时消息
    RocketMQ源码 — 八、 RocketMQ消息重试
    HDU3439 Sequence
    Cipolla算法学习小记
    BZOJ2286: [Sdoi2011]消耗战
    BZOJ4873 寿司餐厅
    BZOJ1718 [Usaco2006 Jan] Redundant Paths 分离的路径
    BZOJ1123 [POI2008]BLO
    BZOJ3996 TJOI2015线性代数
  • 原文地址:https://www.cnblogs.com/jaywang/p/7748151.html
Copyright © 2011-2022 走看看