1. 程式人生 > 其它 >Stone

Stone

Stone

AliceBob 在玩取石子的遊戲。

他們共有 \(N\) 堆石子,第 \(i\) 堆石子有 \(a_{i}\) 個石子。

AliceBob 輪流取石子, Alice 先取,每一次取石子,當前取石子的人可以任選一堆還沒有被取完的石子,從中取出至少 \(1\) 個,至多 \(x\) 個石子。

如果當前取石子的人沒有石子堆可選,那麼他(她)就輸掉了遊戲。

他們想知道,如果 AliceBob 都用最優策略玩遊戲的話,誰會勝利。

由於 AliceBob 還沒商量好 \(x\) 取多少,所以對於每個 \(1\)\(N\) 之間的 \(x\),你都需要告訴他們誰將取得勝利。

對於 \(20\%\) 的資料, \(N\leqslant 8\)

對於 \(50\%\) 的資料, \(N\leqslant 5\times 10^3\)

對於 \(100\%\) 的資料, \(1\leqslant N\leqslant 5\times 10^5,1\leqslant a_{i}\leqslant N\)

首先,當\(a_i< x\)時,就是經典的取石子了

而只有一堆石子的時候,同樣非常經典

所以不難得出當\(0={\LARGE\oplus}_{i=1}^Na_i\%(x+1)\)時為必敗態

因為我們可以將所有\(a_i\)拆成\(v+(x+1)t\),使得先手無論如何操作,後手總能使之等效於模數的\(Nim\)

遊戲

這樣就變成了計算所有數模某個數的異或和

我們設\(f_{i,j}\)表示值域區間在\([i,i+2^j)\)內的元素減去\(i\)後的異或和

\(g_{i,j}\)表示值域區間在\([i,i+2^j)\)內的元素的元素奇偶性

不難得到\(f_{i,j}=f_{i,j-1}\oplus f_{i+2^{j-1},j-1}\oplus(g_{i+2^{j-1},j-1}*2^{j-1})\)

這樣就可以如同\(ST\)表地查詢了

時間複雜度\(O(n\log^2n)\)

#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define read read1<ll>()
# define Type template<typename T>
Type T read1(){
	T t=0;
	char k;
	bool vis=0;
	do (k=getchar())=='-'&&(vis=1);while('0'>k||k>'9');
	while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar();
	return vis?-t:t;
}
# define fre(k) freopen(k".in","r",stdin);freopen(k".out","w",stdout)
# define ll long long
int a[500005],s,v[20][500005],h[20][500005],Log2[500005];
int query(int l,int r){
	int t=0,g=0;
	for(int i;l<=r;)
		if(i=Log2[r-l+1],l+(1<<i)-1<=r)
			t^=v[i][l]|(h[i][l]*g),l+=1<<i,g|=1<<i;
	return t;
}
char pr[3000005],*Sta=pr;
int main(){
	fre("stone");
	s=read;
	for(int i=1;i<=s;++i)h[0][read]^=1;
	for(int i=2;i<=s+1;++i)Log2[i]=Log2[i>>1]+1;
	for(int i=0;(1<<i+1)<=s+1;++i)
		for(int j=0;j+(1<<i+1)-1<=s;++j)
			h[i+1][j]=h[i][j]^h[i][j+(1<<i)],
			v[i+1][j]=v[i][j]^v[i][j+(1<<i)]^(h[i][j+(1<<i)]<<i);
	for(int i=1;i<=s;++i){
		int ans=0;
		for(int j=0;j<=s;j+=i+1)
			ans^=query(j,min(j+i,s));
		if(ans){
			memcpy(Sta,"Alice",5);
			Sta[5]=" \n"[i==s];Sta+=6;
		}else{
			memcpy(Sta,"Bob",3);
			Sta[3]=" \n"[i==s];Sta+=4;
		}
	}fwrite(pr,1,Sta-pr,stdout);
	return 0;
}
因果乃旋轉紡車,光彩之多面明鏡
浮世蒼茫,不過瞬逝幻夢
善惡愛誑,皆有定數
於命運之輪中
吞噬於黃泉之冥暗
嗚呼,吾乃夢之戍人
幻戀之觀者
唯於萬華鏡中,永世長存