BZOJ2844 albus就是要第乙個出場

2021-10-06 02:10:53 字數 3226 閱讀 6002

傳送門 to bzoj

傳送門 to vj

看到異或,想到線性基。再仔細觀察一下,好像每個元素出現的次數都是一樣的耶!

我們有兩種證明方法。其一是,考慮某個異或和出現次數超過一的原因:⨁cy

ca=0

\bigoplus_a=0

⨁cyc​a

=0,所以乙個已經存在的方案與之異或即可得到新方案。顯然這一條對於所有數字的湊出都適用。

其二更嚴謹。線性基中曾經用到過這個重要結論:

\與

\的所有子集的異或和相同。既然如此,把集合中的每個元素都變化成線性基中的元素,並記錄其個數。即:知曉集合變成了

\。其中 a×b

a\times b

a×b 表示 a

aa 個 b

bb 元素。

此時湊出乙個數的方案有多少個呢?如果我們需要乙個 x

1x_1

x1​ ,那麼我們需要在 n

1n_1

n1​ 中選出奇數個數字,否則是偶數個。這個數量顯然是 2n1

−1

2^2n

1​−1

,二者都是。然後湊出乙個數的最終個數為 ∏i2

ni−1

=2n−

cn

t\prod_2^=2^

∏i​2ni

​−1=

2n−c

nt,因為 ∑in

i=

n\sum_n_i=n

∑i​ni​

=n。c nt

cntcn

t 表示線性基中的元素個數。

現在,我們的目標是,求出 [0,

q)

[0,q)

[0,q

) 中有多少個不同的異或和。這是很簡單的,因為小於 q

qq 的數字一定存在乙個二進位制位,滿足這一位以前相同、這一位較小。這就是線性基可以處理的了。假設這一位是 i

ii ,在 q

qq 的第 i

ii 位為 1

11 的情況下,線性基中有 r

rr 個元素可以操控比 i

ii 更低的位,那麼方案數就是 2

r2^r

2r,線性基中的元素隨便選唄。

#include

#include

#include

using

namespace std;

typedef

long

long int_;

inline int_ readint()

const

int zxy =

10086

;int_ d[

100]

;int cnt;

void

insert

(int_ x)}}

intmain()

for(

int i=

1; i<=n-cnt;

++i)

ans =

(ans<<1)

%zxy;

printf

("%d\n"

,(ans+1)

%zxy)

;return0;

}

重要的事情說一百遍。請將模數取名為 zxy

zxyzx

y !——《爆零是zxy

zxyzx

y的謊言》

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

zxy orz

BZOJ2844 albus就是要第乙個出場

傳送門 給定乙個含 n 個自然數的集合s,將 2s中所有集合的所有元素的異或和從小到大排列 下標從 1 開始 求ta r在其中第一次出現的下標 保證給出的數出現過 對 10086 取模.1 n 105 ai 109.首先tar 0的情況最好先特判掉.然後我們要求的是從 s 中取若干元素 可以不取 異...

bzoj 2844 albus就是要第乙個出場

首先就是乙個線性基。然後不能放進去的相當於0,然後列舉前多少位和m相同,那麼後一位比m小的方案累加入答案即可。ac 如下 include define mod 10086 using namespace std int n,m,cnt,bin 35 bs 35 s 35 bool ins int x...

BZOJ2844 albus就是要第乙個出場

給出a陣列,共有n個數,你可以選其中一些出來xor 至少乙個數 所以可能的xor結果值排序後去重,問你排在第k個的結果值是多少.線性基有個性質 線性基內任意集合異或結果唯一,而所有數異或0還是本身 所以每個數字出現的個數就等於 1 異或值為0的集合個數 2 n cnt 所以問題就轉化為求線性基有效位...