感謝 morning_glory 贊助異或異
或 de
scri
ptio
ndes
crip
tion
給定 l,r
l,r, 求∑i
=lr∑
j=lr
i⊕ji
=l∑r
j=l
∑ri
⊕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 ...