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