我是靠谱客的博主 健康玉米,最近开发中收集的这篇文章主要介绍LOJ 6087. 毒瘤题 (数论),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目描述

传送门

题目大意:在集合中找出 k (k≤2)个出现了奇数次的正整数 a。
注意内存:2MB

题解

当k=1的时候,我们可以对所有的数求异或和,得到的异或和即为a,因为出现偶数次的都两两消掉了。
k=2的时候,我们得到的异或和是a^b。
对于二进制的每一位维护cnt[i]表示有多少数二进制的第i位中1,c[i]表示所有第i位为1的数的异或和。
如果ans中某一位是1,那么说明a,b两个数中有一个数该位是1,那么对应的c[i]就是其中一个数的答案。对应ans取异或就可以得到另一个数的答案。

代码

#include<cstdio>
#include<algorithm>
using namespace std;
int c[37],cnt[37],n,k,ans;
int main()
{
    freopen("a.in","r",stdin);
     scanf("%d%d",&n,&k);
     for (int i=1;i<=n;i++) {
        int x; scanf("%d",&x);
        ans=ans^x;
        for (int i=0;i<=31;i++)
         if ((x>>i)&1) c[i]^=x,cnt[i]++;
     }
     if (k==1) {
        printf("%dn",ans);
        return 0;
     }
     int a,b;
     for (int i=31;i>=0;i--)
      if (cnt[i]%2) a=c[i];
     b=ans^a;
     if (b<a) swap(a,b);
     printf("%d %dn",a,b);
}

最后

以上就是健康玉米为你收集整理的LOJ 6087. 毒瘤题 (数论)的全部内容,希望文章能够帮你解决LOJ 6087. 毒瘤题 (数论)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部