BZOJ2844:albus就是要第一個出場——題解

https://www.lydsy.com/JudgeOnline/problem.php?id=2844php

已知一個長度爲n的正整數序列A(下標從1開始), 令 S = { x | 1 <= x <= n }, S 的冪集2^S定義爲S 全部子集構成的集合。
定義映射 f : 2^S -> Z
f(空集) = 0
f(T) = XOR A[t] (對於一切t屬於T)
如今albus把2^S中每一個集合的f值計算出來, 從小到大排成一行, 記爲序列B(下標從1開始)。
給定一個數, 那麼這個數在序列B中第1次出現時的下標是多少呢?html

這話真的不是人說出來的。ios

簡單翻譯一下題就是序列全部的子集(可爲空)的異或和通過排序,給一個q,求q在排序後序列中的位置下標。git

參考:https://blog.sengxian.com/algorithms/linear-basispost

若是是無重的,咱們按照相似HDU3949:XOR的作法二進制分解q便可作(看代碼應該更好理解吧)。url

可是有重集合就很尷尬。spa

不過咱們有對於一個數x,它出現次數必定是2^(n-size)(size爲線性基大小)。翻譯

詳細證實能夠看參考,這裏給出個人想法。code

顯然對於原線性基有且僅有一種方法構造出來x,且有且僅有一種方法構造出來非線性基內但卻在a序列中的數。htm

那麼對於非線性基內但卻在a序列中的數有(n-size)個,它們和線性基內的數異或爲0的方法有(n-size),排列組合就有2^(n-size)個,再與僅有一種方法構造出來x,就有2^(n-size)個了。

因而我知道了它去重前的排名,它排名前面的數都乘上2^(n-size)後+1即爲答案。

PS:本身曾經也糾結過第一次算ans是否須要減一,但後來發現集合可爲空……emmm這不值就有0了嗎,對於0也知足這個性質啊,可是ans算排名的時候忽略了0啊。因此至關於ans-1+1=ans了啊。

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
#include<cctype>
#include<algorithm>
using namespace std;
const int N=100010;
const int p=10086;
const int BASE=30;
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
int qpow(int k,int n){
    int res=1;
    while(n){
    if(n&1)res=res*k%p;
    k=k*k%p;
    n>>=1;
    }
    return res;
}
int a[N],b[BASE+4],cnt;
vector<int>mp;
int main(){
    int n=read();
    for(int i=1;i<=n;i++){
    a[i]=read();
    for(int j=BASE;j>=0;j--){
        if(a[i]>>j&1){
        if(b[j])a[i]^=b[j];
        else{
            b[j]=a[i];cnt++;
            break;
        }
        }
    }
    }
    int q=read(),ans=0;
    for(int i=0;i<=BASE;i++)
    if(b[i])mp.push_back(i);
    for(int i=0;i<mp.size();i++){
    if(q>>mp[i]&1)ans+=1<<i;
    ans%=p;
    }
    ans=ans*qpow(2,n-cnt)%p+1;
    printf("%d\n",ans%p);
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文做者:luyouqi233。               +

+歡迎訪問個人博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

相關文章
相關標籤/搜索