BZOJ 2844: albus就是要第一个出场 线性基
之前求的是排名为 $i$ 的异或值,现在反过来了.
但是求法挺像的,还是二进制拆分,然后按照之前的方式统计一下就可以了.
#include <cstdio> #include <algorithm> #define M 60 #define N 60 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; ll qpow(ll base,ll k,ll mod) { ll tmp=1; for(;k;k>>=1,base=base*base%mod) if(k&1) tmp=tmp*base%mod; return tmp; } int n,m,p[N*10]; ll d[N*10]; void insert(ll x) { for(int i=M;i>=0;--i) { if(x&(1ll<<i)) { if(d[i]) x^=d[i]; else { d[i]=x; break; } } } } int main() { // setIO("input"); ll q,rk=0; int i,j; scanf("%d",&n); for(i=1;i<=n;++i) { ll a; scanf("%lld",&a), insert(a); } scanf("%lld",&q); for(i=0;i<=M;++i) if(d[i]) p[m++]=i; for(i=0;i<m;++i) { if(q&(1ll<<p[i])) { rk+=(1ll<<i); } } printf("%lld\n",(qpow(2,n-m,10086)*rk%10086+1)%10086); return 0; }