BZOJ 2844 albus就是要第乙個出場

2021-09-25 22:54:27 字數 1283 閱讀 1030

已知乙個長度為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

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

input

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

output

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

sample input

3 1 2 3 1

sample output

3 樣例解釋: 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]

hint

資料範圍:

1 <= n <= 10,0000

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

get結論:假設一共n個數,線性基一共cnt個數,那麼這n個數一共可以構成2^cnt個數,每個數出現2^(n-cnt)次.

#includeusing namespace std;

int n, m;

#define ll long long

int d[63]; static const int deg = 62;

int nu = 0;

void ins(ll x)

x ^= d[i];

}}int cnt = 0, num[63], id[63];

const int mod = 10086;

int main()

for (int i = 0; i <= 62; i++)

cin >> q;

ll ans = 0;

for (int i = 0; i < cnt; i++)

for (int i = n - nu; i >= 1; i--)

ans *= 2, ans %= mod;

cout << (ans + 1) % mod << "\n";

return 0;

}

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