bzoj2844 albus就是要第乙個出場

2022-04-06 13:32:55 字數 2095 閱讀 5624

time limit:

6 sec  memory limit:

128 mb

submit:

2254  solved:

934[submit][status][discuss]已知乙個長度為n的正整數序列a(下標從1開始), 令 s = , s 的冪集2^s定義為s 所有子

集構成的集合。定義對映 f : 2^s -> zf(空集) = 0f(t) = xor a[t] , 對於一切t屬於t現在albus把2^s中每個集

合的f值計算出來, 從小到大排成一行, 記為序列b(下標從1開始)。 給定乙個數, 那麼這個數在序列b中第1

次出現時的下標是多少呢?

第一行乙個數n, 為序列a的長度。接下來一行n個數, 為序列a, 用空格隔開。最後乙個數q, 為給定的數.

共一行, 乙個整數, 為q在序列b中第一次出現時的下標模10086的值.

31 2 313

樣例解釋:

n = 3, a = [1 2 3]

s =

2^s = , , , , , , }

f(空) = 0

f() = 1

f() = 2

f() = 3

f() = 1 xor 2 = 3

f() = 1 xor 3 = 2

f() = 2 xor 3 = 1

f() = 0

所以b = [0, 0, 1, 1, 2, 2, 3, 3]

資料範圍:

1 <= n <= 10,0000

其他所有輸入均不超過10^9

湖北省隊互測

[submit][status][discuss]

題解:問題即求子集異或和的某個數的排名;

線性基的性質:若$a,|a|=n$的線性基為$b$,$|b|=k$,則有$2^k$個不同的子集異或和,且每個會出現$2^$次;      

由基的線性無關性可以知道有且僅有$2^k$個異或和互不相同;

這k個基是可以從$a_i$裡選出來的,只是我們為了好寫,一般插入就直接消元到某個陣列裡;

考慮他們的子集異或和s1,另外有$n-k$個數,可以被b中的向量唯一表示,考慮子集異或和s2 ;

s1 ^s2 也是一種合法的選法;

這樣有$

2^k * 2^ = 2^n$種 ,說明只有$2^n$且按照這種方式對應;

如果你關心乙個蒟蒻的不太嚴謹的證明的話

注意消元的兩個迴圈(line23 line24 )有順序;

複雜度;$ o(n log \ a_ +  log \ a_) $

20181030

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include

11#define run(i,l,r) for(int i=l;i<=r;i++)

12#define don(i,l,r) for(int i=l;i>=r;i--)

13#define ll long long

14#define inf 0x3f3f3f3f

15using

namespace

std;

16const

int n=100010 , mod=10086;17

int n,d[31

],q;

18void ins(int

x)26

else x^=d[i]; 27}

28}29int pw(int x,int

y)35

return

re;36}37

int query(int

x)47

}48 re=re*pw(2,n-cnt)%mod;

49return

re;50}51

intmain()

59int x;scanf("

%d",&x);

60 cout<

61return0;

62 }//

by tkys_austin;

view code

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 所以問題就轉化為求線性基有效位...