【bzoj2844 albus就是要第一个出场】

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/sxy201658506207/article/details/84667728