1 条题解

  • 0
    @ 2025-8-24 22:31:41

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar I_like_magic
    I_like_magic

    搬运于2025-08-24 22:31:41,当前版本为作者最后更新于2022-12-28 22:33:48,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    这题其实不难

    但如果用暴力,肯定过不了

    所以我们得想另一种办法

    我们发现,只有 11 异或 00 的值为 11

    例如:

    11 , 00 , 11 两两异或的和为 2

    其实就是每个 00 与每一个 11 异或时,sumsum 要加 11

    所以,我们只要把每一位的 0011 的数量都统计出来,再进行运算,就可以快速得出 sumsum

    ACCodeAC\hspace{0.2cm}Code

    #include<bits/stdc++.h>//万能头文件
    #define int long long//记得开 long long
    using namespace std;
    int n,cnt[100],sum;
    signed main(){
    	scanf("%lld",&n);
    	for(int i=1;i<=n;i++){
    		int a,j=1;
    		scanf("%lld",&a);
    		while(a){
    			cnt[j]+=a%2;//统计每一位 1 的个数
    			j++;
    			a/=2;
    		}
    	}
    	for(int i=1;i<=30;i++){
    		sum+=cnt[i]*(n-cnt[i])*(1<<(i-1));//算出每一位的异或值
    	}
    	printf("%lld",sum);
    	return 0;//完美收尾
    }
    
    • 1

    信息

    ID
    6825
    时间
    1000ms
    内存
    32MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者