周赛 区间异或 题解(找规律)+异或知识讲解

一:异或的含义

或在数学中的含义:一个元素在集合A中或在集合B中,或的维恩图如下:

而异或是不允许共存的,所以 A ^ B 的维恩图如下:

同理对于 A ^ B ^ C 维恩图:

异或运算{\displaystyle A\oplus B}A\oplus B 的真值表如下:F表示false,T代表true

A B
F F F
F T T
T F T
T T F

二、异或的性质:满足交换律和结合律

  •  交换律:A ^ B = B ^ A;
  •  结合律:A ^ (B ^ C) = (A ^ B) ^ C;
  • 恒等律:X ^ 0 = X;
  • 归零律:X ^ X = 0;
  • 自反:A ^ B ^ B = A ^ 0 = A;
  •  对于任意的 X: X ^ (-1) = ~X;
  •  如果 A ^ B = C 成立,那么 A ^ B = C,B ^ C = A;

三、异或的应用

1. 1-1000放在含有1001个元素的数组中,只有唯一的一个元素重复,找出这个重复的数字。要求不能使用辅助存储空间并且数组的每个元素只能访问一次。

解法一:将这1001个元素加起来的和减去1+2+……+1000,所得的值就是重复的数字(数据过大容易溢出)。

解法二:异或

将1001个数全部异或得到的值再与1^2^……^1000的结果再次异或,这样就避免了数据过大溢出的情况。

首先,异或运算满足交换律和结合律,即a^b = b^a,(a^b)^c = a^(b^c)。令重复的数字为n:

所以1 ^ 2 ^ … ^ n ^ n ^ … ^ 1000 = 1 ^ 2 ^ … ^ 1000 ^ (n ^ n) = 1 ^ 2 ^ … ^ 1000 ^ 0 = 1 ^ 2 ^ … ^ 1000(即序列中除了重复数字 n 以外所有数的异或。

如果令1 ^ 2 ^ … ^ 1000(序列中不包含n)的结果为T,那么1 ^ 2 ^ … ^ 1000(序列中包含n)的结果就是 T^n,T ^ (T ^ n) = n。

2. 变形:一个数组存放若干整数,一个数出现奇数次,其余数均出现偶数次,找出这个出现奇数次的数。

解法与上面的解法二相同。

题目链接

题目思路

本题需要知道异或的一个性质:a^a=0 因此某个长度出现偶数次那么这些长度异或一定等于0 ,某个长度出现奇数次一定只会剩下一个

如样例 1 ^ 1 ^ 1 ^ 2 ^ 2 ^ 3=1 ^ 3=2

因此如果长度为偶数那么最后答案为小于等于的长度的偶数进行异或,如果为奇数那么最后答案为小于长度的奇数进行异或。

对于这一部分你可以通过找规律得出答案 。规律为长度从2开始周期为8

第一组:2 2 6 7 0 0 8 9

第二组 :2 2 14 15 0 0 16 17

第三组 : 2 2 22 23 0 0 24 25

代码

#include<cstdio>
using namespace std;
typedef long long ll;
ll l,r,len,ans;
int main(){
    scanf("%lld %lld",&l,&r);
    len=(r-l-1)%8+2;
    ll n=(r-l-1)/8;
    if(len==2||len==3){
        ans=2;
    }else if(len==6||len==7){
        ans=0;
    }else if(len==4||len==5){
        ans=8*n+len+2;
    }else if(len==8||len==9){
        ans=8*n+len;
    }
    printf("%lld",ans);
    return 0;
}

参考文章 https://blog.csdn.net/Jasmineaha/article/details/81412711

发布了68 篇原创文章 · 获赞 2 · 访问量 2270

一:异或的含义

猜你喜欢

转载自blog.csdn.net/m0_46209312/article/details/104882286
今日推荐