zoukankan      html  css  js  c++  java
  • 连续数字异或和

    求[1,n]所有数的异或和

    如果加以打表,我们会发现其异或和有一定的规律

    我们设f(x,y)表示区间[x,y]的异或和
    那么有
    对于k>=1
    (f(2^k,2^{k + 1} - 1))中,最高位(2^k)的1出现了(2^k)次,异或和为0,所以最高位可以去掉
    (f(2^k,2^{k + 1} - 1) = f(2^k - 2^k,2^{k + 1} - 1 - 2^k) = f(0,2 ^ k - 1))
    所以
    (f(0,2^{k + 1} - 1) = f(0,2^k - 1) Xor f(2^k,2^{k + 1} - 1) = 0)

    由此,对于所有(k>=2),有(f(0,2^k - 1) = 0)
    所以,对于(f(0,n)),设其最高位为(2^k)
    那么(f(0,n) = f(0,2^k - 1) Xor f(2^k,n) = f(2^k,n))
    ([2^k,n])中,最高位出现的次数取决与n的奇偶

    1、若n为奇数,那么最高位出现了(n + 1)次为偶数,可以去掉
    (f(2^k,n) = f(0,n - 2^k)),可以发现(n - 2^k)与n具有相同的奇偶性,可以利用同样的推导去掉
    最后(f(0,n))的就取决于<4的部分,即mod 4后的异或和

    那么我们有:
    如果n为奇数
    (n equiv 1 pmod{4})(f(0,n) = 1)
    (n equiv 3 pmod{4})(f(0,n) = 0)

    2、若n为偶数,那么最高位出现了(n + 1)次为奇数,一定可以保留
    同样的,(f(2^k,n) = f(0,n - 2^k)),可以发现(n - 2^k)与n具有相同的奇偶性,可以利用同样的推导去掉
    最后(f(0,n))的后两位就取决于<4的部分

    那么我们有:
    如果n为偶数
    (n equiv 0 pmod{4})(f(0,n) = n)
    (n equiv 2 pmod{4})(f(0,n) = n + 1)

    这样,我们就get了一个(O(1))求连续数字异或和的方法

    (n equiv 0 pmod{4})(f(0,n) = n)
    (n equiv 1 pmod{4})(f(0,n) = 1)
    (n equiv 2 pmod{4})(f(0,n) = n + 1)
    (n equiv 3 pmod{4})(f(0,n) = 0)

  • 相关阅读:
    序列化与反序列化之Kryo
    集合框架
    dubbo配置方式简单介绍
    sql(Oracle)优化之索引
    多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
    Storm 性能优化
    web.xml配置重理解
    Java各个版本的新特性
    这两天光写shell了,再贴一段代码,以供日后参考。
    Hadoop常用操作笔记
  • 原文地址:https://www.cnblogs.com/Mychael/p/8633365.html
Copyright © 2011-2022 走看看