嘟嘟嘟(洛谷)
這道題算是利用了線性基的乙個性質:對於大小為\(k\)的線性基中亦或出來的乙個數\(x\),那麼用原陣列的數亦或出來的所有數中,\(x\)出現了\(2 ^ \)次。
那麼就可以算出線性基中比\(x\)小的數有多少個(記為\(cnt\)),然後答案就是\(cnt * 2 ^ + 1\)。
(其實我現在還不是特別懂)
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define enter puts("")
#define space putchar(' ')
#define mem(a, x) memset(a, x, sizeof(a))
#define in inline
typedef long long ll;
typedef double db;
const int inf = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 1e5 + 5;
const int maxn = 31;
const ll mod = 10086;
inline ll read()
while(isdigit(ch))
if(last == '-') ans = -ans;
return ans;
}inline void write(ll x)
int n;
int p[maxn];
in void insert(int x) }}
int b[maxn], cnt = 0;
in ll quickpow(ll a, ll b)
int main()
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 所以問題就轉化為求線性基有效位...