Divan and bitwise operations 异或,同或,组合数学(1500)
生活随笔
收集整理的這篇文章主要介紹了
Divan and bitwise operations 异或,同或,组合数学(1500)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意 :
- 原序列長為n,給m個連續子序列的左右端點的下標以及該連續子序列的或和,保證這m個連續子序列的并集包含原序列每一個點,求原序列的所有子序列的異或的和,輸出任意一種
思路 :
- 由于位運算對每個位都是獨立的,考慮分別對每一位求解
- 首先看輸入的給我們帶來什么,對于[l,r]得到的同或和x,考慮它的某一位,如果這一位是0,說明[l,r]每個元素這位都是0,如果這一位是1,至少有1個1,后者沒什么用
- 考慮某一位bit,一共有n個元素,假設有a個1,b個0,顯然有a+b=na+b=na+b=n
- 我們如果要對結果(所有子序列異或和的總和),就要選出若干個元素使它們異或和為1,根據異或和的性質,需要選擇奇數個1和若干個(0)0
- 選奇數個1的方案為Ca1+Ca3+...=2a?1C_{a}^{1}+C_{a}^{3}+... =2^{a-1}Ca1?+Ca3?+...=2a?1,選任意個0的方案為2b2^{b}2b
- 根據乘法原理,總方案數為2a?1?2b=2a+b?1=2n?12^{a-1}*2^b=2^{a+b-1}=2^{n-1}2a?1?2b=2a+b?1=2n?1,在當前bit位上貢獻為1<<bit1<<bit1<<bit
- 所以對于每個位,只要有1,那么這個位對結果的貢獻就是2n?1?(1<<bit)2^{n-1}*(1 << bit)2n?1?(1<<bit),否則這個位對結果的貢獻是0
- 假設bit位存在1,那么v中就可以拆除一塊(1 << bit),我們按照這種方法把v拆成若干個塊,每個塊都能產生這么多貢獻,因此可以直接用v乘上2n?12^{n-1}2n?1得到答案
- 即,只要看哪些位有1,(1<<bit)?2n?1(1<<bit)*2^{n-1}(1<<bit)?2n?1即可,事實上,設置一個初始變量v為00…0,每次讀入一個區間,都能知道哪些位現在至少有一個1,這個位可以被累加答案了,v|=x
總結
以上是生活随笔為你收集整理的Divan and bitwise operations 异或,同或,组合数学(1500)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bitwise Exclusive-OR
- 下一篇: 王道计算机考研 数据结构 (栈和队列)