Codeforces1194D. 1-2-K Game sg函数打表

https://codeforces.com/contest/1194/problem/D
假设k==3

sg[0]=0,
sg[1]=mex{sg[0]}=1,
sg[2]=mex{sg[0],sg[1]}=2,
sg[3]=mex{sg[0],sg[1],sg[2]}=3,
sg[4]=mex{sg[1],sg[2],sg[3]}=0,
sg[5]=mex{sg[2],sg[3],sg[4]}=1,
sg[6]=mex{sg[3],sg[4],sg[5]}=2,
sg[7]=mex{sg[4],sg[5],sg[6]}=3,
sg[8]=mex{sg[5],sg[6],sg[7]}=0.

0,1,2,3循环 策略是先手是4的倍数必败

假设k==4

sg[0]=0,
sg[1]=mex{sg[0]}=1,
sg[2]=mex{sg[0],sg[1]}=2,
sg[3]=mex{sg[1],sg[2]}=0,
sg[4]=mex{sg[0],sg[2],sg[3]}=1,
sg[5]=mex{sg[1],sg[3],sg[4]}=2,
sg[6]=mex{sg[2],sg[4],sg[5]}=0,
sg[7]=mex{sg[3],sg[5],sg[6]}=1,
sg[8]=mex{sg[4],sg[6],sg[7]}=2.

0,1,2循环 策略是先手是3的倍数必败
Codeforces1194D. 1-2-K Game sg函数打表_第1张图片

int q,n,k,ans;
ll a[maxn];

int main()
{
/*	int vis[25];
	memset(vis,0,sizeof vis);
	for(int i = 3 ; i < 20 ; i++) {
		cout<<"i: "<=0 && !vis[j-1]) || (j-2>=0 && !vis[j-2]) ||(j-i>=0&& !vis[j-i])){
				vis[j] = 1;
			}
			cout<>t;
	while(t--){
		cin>>n>>k;

		bool BobWin=true;
            if(k%3==0){	//k=3  循环节=k+1 
                n%=(k+1);//余数0-k 
                if(n%3)//第一个 011 1 011 1 01
                    BobWin=false;
                if(n==k)//第k+1个 
                    BobWin=false;
            }
            else{//循环节=3 011 011
                if(n%3)
                    BobWin=false;
            }

            puts(BobWin?"Bob":"Alice");
    }
	return 0;
}
	int t;
	cin>>t;
	while(t--){
		cin>>n>>k;
		if(k%3==0){
			int x=(n+1)%(k+1);	//一轮内 余数0-k 
			if(x%3==1)	//011 1 011 1 01
				cout<<"Bob"<

你可能感兴趣的:(博弈)