BZOJ2844 albus就是要第乙個出場

2021-07-15 04:49:59 字數 1929 閱讀 1339

傳送門

給定乙個含

n 個自然數的集合s,將

2s中所有集合的所有元素的異或和從小到大排列(下標從

1 開始),求ta

r在其中第一次出現的下標(保證給出的數出現過),對

10086

取模.1≤

n≤105

,ai≤

109.

首先tar

=0的情況最好先特判掉.

然後我們要求的是從

s 中取若干元素(可以不取)異或和小於ta

r的方案數.

然後依舊照上一題的方法高斯消元求線性基.

我們記錄一下消出來的

0 的個數,先不考慮它們.

然後從線性基中取出一些數,使得它們的異或和為ta

r,這個方案是唯一的.

然後我們列舉這些數中哪乙個不取,那麼比它小的數就可以隨便取了.

最後再算上

0 也可以隨便取.

複雜度大概是o(

30n).

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define fi first

#define se second

#define pb push_back

#define y1 kjfasiv

#define lowbit(x) (x&-x)

#define debug(x) cout<<#x<<"="namespace

std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair pii;

typedef pairpll;

typedef

vector

veci;

const

int mod=10086,inf=0x7fffffff,rx=,ry=;

const

double pi=acos(-1.0),eps=1e-8;

template

void rd(t &res)

template

inline

void max(t &a,t b)

template

inline

void min(t &a,t b)

int fast_mod_pow(int a,int b)

const

int n=(int)1e5+5;

int n,cnt_zero,num[n];

void gauss()

cnt_zero=n-ptr;

n=ptr;

}int main()

}mod_add(ans,1);

(ans*=fast_mod_pow(2,cnt_zero))%=mod;

mod_add(ans,1);

printf("%d\n",ans);

return0;}

/* jul.19.16

tags:math,xor,gauss elimination

submissions:2

memory 1684kb

time 232ms

code length 2034b

*/

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

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