BZOJ2844 albus就是要第乙個出場

2021-08-30 17:53:57 字數 1498 閱讀 6114

給出a陣列,共有n個數,你可以選其中一些出來xor(至少乙個數).

所以可能的xor結果值排序後去重,問你排在第k個的結果值是多少.

線性基有個性質:線性基內任意集合異或結果唯一,而所有數異或0還是本身

所以每個數字出現的個數就等於(1*異或值為0的集合個數) = 2^(n-cnt)

所以問題就轉化為求線性基有效位cnt,和q在所有異或值中第幾大

#include

#include

using namespace std;

typedef

long

long

int ll;

const

int maxn=

1e5+7;

const

int mod=

1e9+7;

struct linear_basis

void

ins(ll x)

x^=b[i];}

} flag=true;

return;}

bool fin

(ll x)

}return0;

} ll max

(ll x)

return res;

} ll min

(ll x)

return res;

} ll rebuild()

}for

(int i=

0;i<=

62;i++)}

ll kth_max

(ll k)

return res;

}}lb;

void

merge

(linear_basis &a,linear_basis &b)

b=a;

}int id[65]

,cnt=0;

intmain()

scanf

("%d"

,&q)

; ll ans=0;

for(

int i=

0;i<=

30;i++)if

(lb.b[i]

)id[cnt++

]=i;

//記錄線性基中有效位=

for(

int i=cnt-

1;i>=

1;i--

) ans%

=10086

;for

(int i=

1;i<=n-cnt;i++

)printf

("%d\n"

,(ans+1)

%10086);

return0;

}

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...

BZOJ 2844 albus就是要第乙個出場

已知乙個長度為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開始 給定乙個數,那麼這個數在序列...