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