[BZOJ2844]albus就是要第一個出場

題目

傳送門 to BZOJ

傳送門 to VJ

思路

看到異或,想到線性基。再仔細觀察一下,好像每個元素出現的次數都是一樣的耶!

我們有兩種證明方法。其一是,考慮某個異或和出現次數超過一的原因:cyca=0\bigoplus_{cyc}a=0 ,所以一個已經存在的方案與之異或即可得到新方案。顯然這一條對於所有數字的湊出都適用。

其二更嚴謹。線性基中曾經用到過這個重要結論:{a,b,}\{a,b,\dots\}{a,ab,}\{a,a\oplus b,\dots\} 的所有子集的異或和相同。既然如此,把集合中的每個元素都變化成線性基中的元素,並記錄其個數。即:知曉集合變成了 {n1×x1,n2×x2,}\{n_1\times x_1,n_2\times x_2,\dots\} 。其中 a×ba\times b 表示 aabb 元素。

此時湊出一個數的方案有多少個呢?如果我們需要一個 x1x_1 ,那麼我們需要在 n1n_1 中選出奇數個數字,否則是偶數個。這個數量顯然是 2n112^{n_1-1} ,二者都是。然後湊出一個數的最終個數爲 i2ni1=2ncnt\prod_{i}2^{n_i-1}=2^{n-cnt} ,因爲 ini=n\sum_{i}n_i=ncntcnt 表示線性基中的元素個數。

現在,我們的目標是,求出 [0,q)[0,q) 中有多少個不同的異或和。這是很簡單的,因爲小於 qq 的數字一定存在一個二進制位,滿足這一位以前相同、這一位較小。這就是線性基可以處理的了。假設這一位是 ii ,在 qq 的第 ii 位爲 11 的情況下,線性基中有 rr 個元素可以操控比 ii 更低的位,那麼方案數就是 2r2^r ,線性基中的元素隨便選唄。

代碼

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
typedef long long int_;
inline int_ readint(){
	int_ x; scanf("%lld",&x); return x;
}

const int zxy = 10086;

int_ d[100]; int cnt;
void insert(int_ x){
	for(int i=63; i>=0&&x; --i){
		if((x>>i&1) == 0) continue;
		if(d[i] != 0) x ^= d[i];
		else {
			d[i] = x, ++ cnt; break;
		}
	}
}

int main(){
	int n = readint();
	for(int i=1; i<=n; ++i)
		insert(readint());
	int ans = 0, k = readint();
	for(int i=0,t=1; i<64; ++i){
		if(d[i] == 0) continue;
		if(k>>i&1) ans = (t+ans)%zxy;
		t = (t<<1)%zxy; // pow
	}
	for(int i=1; i<=n-cnt; ++i)
		ans = (ans<<1)%zxy;
	printf("%d\n",(ans+1)%zxy);
	return 0;
}

後記

重要的事情說一百遍。請將模數取名爲 zxyzxy !——《爆零是zxyzxy的謊言》

zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
zxy orz
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章