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