luoguP4869 albus就是要第一个出场 线性基
省队选拔前复习一下线性基.
证明不会,永远都不会,学习证明是不可能的
有如下结论:
1. 线性基大小是固定的,不会因为加入顺序不同而改变.
2. 设线性基大小为 k,则一共有 $2^k$ 种不同的异或结果.
3. 每种异或结果出现次数恰好为 $2^{n-k}$.
4. 线性基内的数随便异或线性基也不变.
#include <bits/stdc++.h>
#define mod 10086
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,tot;
int s[50];
ll p[60],a[200000];
void insert(ll v)
{
for(int i=52;i>=0;--i)
{
if((1ll<<i)&v)
{
if(p[i]) v^=p[i];
else { p[i]=v; return; }
}
}
}
ll qpow(ll x,ll y)
{
ll tmp=1;
for(;y;y>>=1,x=x*x%mod) if(y&1) tmp=tmp*x%mod;
return tmp;
}
int main()
{
// setIO("input");
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%lld",&a[i]),insert(a[i]);
ll x;
scanf("%lld",&x);
for(int i=0;i<=52;++i) if(p[i]) s[tot++]=i;
// 多少个比 i 小:
ll rank=0;
for(int i=tot-1;i>=0;--i) if((1ll<<s[i])&x) rank+=1ll<<i;
printf("%lld\n",(rank*qpow(2,n-tot)%mod+1)%mod);
return 0;
}

浙公网安备 33010602011771号