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
",(rank*qpow(2,n-tot)%mod+1)%mod);    
    return 0; 
}

  

原文地址:https://www.cnblogs.com/guangheli/p/13150888.html