異或 異或相關

2022-05-20 05:54:34 字數 2835 閱讀 6803

感謝 morning_glory 贊助

異或異

或 de

scri

ptio

ndes

crip

tion

給定 l,r

l,r, 求∑i

=lr∑

j=lr

i⊕ji

=l∑r

​j=l

∑r​i

⊕jl,

r<=1

09l,

r<=1

09 .s

olut

ions

olut

ion

假設l=1,

r=4l

=1,r

=4, 則將所有涉及到的數字轉換為二進位制如下 ↓↓,

[1∣0

012∣

0103

∣011

4∣10

0]\begin

1\ |\ 0\ 0\ 1 \\

2\ |\ 0\ 1\ 0 \\

3\ |\ 0\ 1\ 1 \\

4\ |\ 1\ 0\ 0 \\

\end⎣⎢

⎢⎡​1

∣001

2∣01

03∣0

114∣

100​

⎦⎥⎥⎤

​按位處

理:按位

處理:以202

0位為例,[1

010]

\begin

1 \\

0 \\

1 \\

0 \\

\end⎣⎢

⎢⎡​1

010​

⎦⎥⎥⎤

​每個數字都要與每個數字異或並且對答案造成貢獻,設0

的數量為

num0

,1的數

量的為n

um1設

0的數量

為num

0​,1

的數量的

為num

1​當前位置為 1

1, 對答案貢獻為 num

0num

0​.當前位置為 0

0, 對答案貢獻為 num

1num

1​.綜上該位答案為 2∗n

um1∗

num0

∗202

∗num

1​∗n

um0​

∗20 .

求num

1,nu

m0:求

num1

​,nu

m0​:

[000

0010

1001

1100

1011

1011

1]0\ 0\ 0 \\

0\ 0\ 1 \\

0\ 1\ 0 \\

0\ 1\ 1 \\

1\ 0\ 0 \\

1\ 0\ 1 \\

1\ 1\ 0 \\

1\ 1\ 1 \\

\end⎣⎢

⎢⎢⎢⎢

⎢⎢⎢⎢

⎢⎡​0

0000

1010

0111

0010

1110

111​

⎦⎥⎥⎥

⎥⎥⎥⎥

⎥⎥⎥⎤

​觀察以上序列, 發現若當前位置為2i2

i位, 則 000..111...00

0..1

11..

.迴圈節長度為 2i+

12i+

1.先來求 [0,

n][0

,n] 中 2i2

i 位置的答案, 則n

um0=

⌊n+1

2i+1

⌋∗2i

+min

num1

=n−n

um0+

1\ \\

num_1 = n-num_0+1nu

m0​=

⌊2i+

1n+1

​⌋∗2

i+mi

nnum

1​=n

−num

0​+1

然後容斥即可求出 [l,

r][l

,r] 的 num

0,nu

m1nu

m0​,

num1

​ .複雜

度o(l

ogn)

複雜度o

(log

n). c

odec

ode

#include

#define reg register

intread()

while

(isdigit

(c)) s = s*

10+ c-

'0', c =

getchar()

;return s * flag;

}const

int mod =

1e9+7;

int l;

int r;

int ans;

int pw[50]

;int

calc

(int x,

int b)

void

work()

printf

("%d\n"

, ans);}

intmain()

異或和之和 異或問題

題目 有n個數,任選3個進行異或,求出所有三元組的異或和的和 普通計算是 o n 3 但是發現,對於異或的運算,就轉換為二進位制的運算,把每乙個陣列轉換為二進位制,再拆分,當且僅當 1 1 1 和 1 0 0 時,答案才為1,否則都是0,也就是說,只有這兩個情況是由貢獻的 把每個數位化為二進位制,然...

異或運算 有趣的異或運算

異或運算可以看做是沒有進製的加法,按位異或運算,相同為0,不同為1。0 0 0 0 1 1 1 0 1 1 1 0 觀察運算結果我們發現,當與0做異或運算時,另一元值不變 而與1做異或運算時,另一元值值取反。根據以上異或運算的特徵,可以有以下用途,除方便直觀外,運算效能也更加優異。1 變數重置0 假...

子段異或(異或字首和)

傳送門 第一行乙個整數 n 代表數列長度。第二行 n 個整數,代表數列。輸出乙個整數,代表答案。示例1 複製5 1 2 3 2 1 複製 2 子段 1,3 和子段 3,5 是合法子段。首先你得知道乙個知識點就是 如果sum i 為陣列a的前i項的異或和,就是說sum i a 1 a 2 a 3 a ...