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; }