1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using namespace std;
const int inf=0x3f3f3f3f;
const int N=100+7;
const int M=2e6+7;
const int mod=1e9+7;
ll d[N],a[N];
int n;
void add(ll x){
repd(i,51,0)
if(x&(1ll<<i)){
if(d[i]) x^=d[i];
else {
d[i]=x;
//"高斯消元,使得对于任意存在于线性基的二进制位i,至多只有一个b[j]满足第i位为 1。可求第k小异或和,最大就全异或"
repd(k,i-1,0) if(d[k]&&(d[i]&(1ll<<k))) d[i]^=d[k];
rep(k,i+1,51) if(d[k]&(1ll<<i)) d[k]^=d[i];
break;
}
}
}
ll ans(){
ll res=0;
repd(i,51,0) res^=d[i];
return res;
}
int main(){
S(n);
rep(i,1,n) {
Sll(a[i]);
add(a[i]);
}
Pll(ans());
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e4+7;
const int M=2e6+7;
const int mod=1e9+7;
int t,n,q,tot;
ll a[N],d[100],k;
void add(ll x){
repd(i,61,0)
if(x&(1ll<<i)){
if(d[i]) x^=d[i];
else {
d[i]=x;
tot++;
repd(k,i-1,0) if(d[k]&&(d[i]&(1ll<<k))) d[i]^=d[k];
rep(k,i+1,61) if(d[k]&(1ll<<i)) d[k]^=d[i];
break;
}
}
}
ll ans(ll k){
if(tot<n)k--;//当tot<n时整体可异或出0,但线性基里面不会
if(k>=(1ll<<tot))return -1;//超过能异或出的数的个数上限
ll ans=0;
//k的第i位为1时,异或第i个线性基中的元素
rep(i,0,61){
if(d[i]){
if(k&1) ans^=d[i];
k>>=1;
}
}
return ans;
}
int main(){
S(t);
rep(Case,1,t){
printf("Case #%d:\n", Case);
INIT(d,0);tot=0;
S(n);
rep(i,1,n) {
SLL(a[i]);
add(a[i]);
}
S(q);
while(q--){
SLL(k);
PLL(ans(k));
}
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e5+7;
const int M=2e6+7;
const int mod=10086;
const int Size=30;
int n,q,a[N],d[100],num=0;
int qpow(int x,int n){
int ans=1;
x%=mod;
while(n){
if(n&1) (ans*=x)%=mod;
(x*=x)%=mod;
n>>=1;
}
return ans%mod;
}
void add(int x){
repd(i,Size,0)
if(x>>i & 1){
if(d[i]) x^=d[i];
else {
num++;
d[i]=x;
break;
}
}
}
vector<int> vec;
int main(){
S(n);
rep(i,1,n){
S(a[i]);
add(a[i]);
}
S(q);
int ans=0;
rep(i,0,Size)
if(d[i]) vec.push_back(i);
rep(i,0,vec.size()-1)
if(q>>vec[i] & 1)
(ans+=(1<<i))%=mod;
P((qpow(2,(n-num))%mod*ans%mod+1)%mod);
return 0;
}
线性基例题
最新推荐文章于 2022-01-08 23:32:25 发布