1. 程式人生 > >bzoj2844 albus就是要第一個出場

bzoj2844 albus就是要第一個出場

組成 .com signed namespace ons sig string closed bre

傳送門:http://www.lydsy.com/JudgeOnline/problem.php?id=2844

【題解】

考慮$n$個數組成的基,大小為$k$,那麽每種方案都有$2^{n-k}$可以取到。

觀察樣例也能發現這個結論。

然後就是正常的線性基統計,最後乘一個$2^{n-k}$,加一即可。

技術分享
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h>

using namespace
std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int N = 1e5 + 10, LG = 30; const int mod = 10086; # define bit(x, i) (((x) >> (i)) & 1) int n, a[N], m, T; int L[LG + 5], Lbase[LG + 5]; int ans = 0; int main() { cin >> n; for (int i=1
; i<=n; ++i) scanf("%d", a+i); cin >> T; for (int i=1; i<=n; ++i) { int t = a[i]; for (int j=30; ~j; --j) { if(!bit(t, j)) continue; if(!Lbase[j]) { Lbase[j] = t; break; } t ^= Lbase[j]; } } m
= 0; for (int i=0; i<31; ++i) if(Lbase[i]) L[++m] = i; for (int i=1; i<=m; ++i) { if(!bit(T, L[i])) continue; ans += (1<<i-1) % mod; ans %= mod; } for (int i=n-m; i>=1; --i) { ans <<= 1; ans %= mod; } ++ans; if(ans >= mod) ans -= mod; cout << ans << endl; return 0; }
View Code

bzoj2844 albus就是要第一個出場