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)

  • 相关阅读:
    Building a Space Station POJ
    Networking POJ
    POJ 1251 Jungle Roads
    CodeForces
    CodeForces
    kuangbin专题 专题一 简单搜索 POJ 1426 Find The Multiple
    The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk's pool
    The Preliminary Contest for ICPC Asia Shenyang 2019 H. Texas hold'em Poker
    The Preliminary Contest for ICPC Asia Xuzhou 2019 E. XKC's basketball team
    robotparser (File Formats) – Python 中文开发手册
  • 原文地址:https://www.cnblogs.com/Mychael/p/8633365.html
Copyright © 2011-2022 走看看