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

浙公网安备 33010602011771号