版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sxy201658506207/article/details/84667728
题意:给定一个n个数的集合S和一个数x,求x在S的2n2n个子集从小到大的异或和序列中最早出现的位置
根据性质每一个数字出现的次数是相同的都是2^(n-cnt)个,cnt是线性基中元素得个数
#include<bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <stdlib.h>
#include <ctime>
using namespace std;
typedef long long ll;
const int mod = 10086;
const int maxn = 1e6 + 5;
using namespace std;
int a[maxn];
int Pow(int a,int n){
int ans=1;
while(n){
if(n&1)(ans*=a)%=mod;
(a*=a)%=mod;
n>>=1;
}
return ans;
}
int main(){
int n,A;
int cnt=0;
cin>>n;
for(int i=0;i<n;++i){
cin>>A;
for(int x=62;x>=0;--x){
if(A&(1ll<<x)){//if((A[i]>>x)&1)
if(a[x]==0){
a[x]=A;
cnt++;
break;
}
A^=a[x];
}
}
}
int Q;
cin>>Q;
vector<int>vec;
int ans=0;
for(int i=0;i<=62;++i)
if(a[i])//构造出来的最高位为1的就在第i位置
vec.push_back(i);//存放位置
for(int i=0;i<(int)vec.size();++i)
if(Q>>vec[i]&1)
ans+=1<<i;//前面多少个数比他小的数字个数,说明Q是第几小的数(ans) //可以变形得到ans
ans=(ans%mod*Pow(2,n-cnt)%mod+1)%mod;
cout<<ans<<endl;
return 0;
}