zoukankan      html  css  js  c++  java
  • 2653 区间xor

    前言

    这个题目在我之前那篇c++位运算的的随笔中提到过。

    有兴趣的话去看看吧!

    飞机场:https://www.cnblogs.com/laoguantongxiegogofs/p/12444517.html

    题目描述

    题目描述

    给出区间(a,b),b >= a,求a xor (a+1) xor (a+2).....xor ba xor (a+1) xor (a+2).....xor b。

    题目输入

    输入2个数:a b,中间用空格分隔(1 <= a <= b <= 10^9)

    样例:

    3 8

    题目输出

    输出一个答案

    样例:

    11

    题解正文

    这个题很水,上面虽然说从1到10的九次方,但是数据并没有那么大,一个暴力循环也会过。

    暴力这里不打了,看过我的那篇位运算的同学应该都会写。

    但是,我们要追求正解。

    下面是一个很好的办法:

    我们找一找规律

    从0到3这四个数异或,也就是0^1^2^3.

    转换为二进制计算为:

    00^01^10^11=0

    从4到7这四个数:

    100^101^110^111=0

    从8到11这四个数:

    1000^1001^1010^1011=0

    从12到15、从16到19……

    相信你找出规律了,这样的每四个数异或的结果都是0.

    又因为0异或所有数都不变,两个相同的数异或得0。(具体看我的位运算那篇文章)

    这样就会有思路了。

    写一个函数work()

    计算1异或到a-1的结果异或1异或到b(为什么异或到a-1不用我说吧)

    就是计算结果了。

    有人说计算a-1多难啊!

    上面不是有方法嘛,把一个数对四取余,按照规律异或就好,时间复杂度会控制在很小很小。

    好了,思路清晰,就上代码吧!

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #define inf 100000000
     7 int work(int x)
     8 {
     9     int k=x%4,ans=0;
    10     x-=k;
    11     for(int i=0;i<=k;i++)
    12     {
    13         ans=ans^(x+i);
    14     }
    15     return ans;
    16 }
    17 using namespace std;
    18 int main()
    19 {
    20     int a,b,x,y;
    21     cin>>a>>b;
    22     printf("%d",work(a-1)^work(b));
    23     return 0;
    24 }

    代码也很简单哎!


    后记

    今天又是一个双更的日子,以后会把提到的题目全部写出题解。如果感觉文章有问题,就在评论区通知我!

    给个赞再走吧!

  • 相关阅读:
    TestNG中DataProvider的用法
    性能调优过程发现的问题
    20170221——接口自动化测试代码提交流程
    svn忽略target文件
    springboot搭建dubbo+zookeeper简单案例
    docker上启动mysql镜像,mysq中记录乱码解决方法
    docker在linux上的安装
    使用jave1.0.2将amr文件转成其他格式报错解决方案
    使用fio命令查看磁盘iops
    解决使用maven clean项目的时候报错,删除target文件夹失败
  • 原文地址:https://www.cnblogs.com/laoguantongxiegogofs/p/12451951.html
Copyright © 2011-2022 走看看