2021牛客暑期多校训练营1 A . Alice and Bob(博弈论 + 暴力)

2021牛客暑期多校训练营1 A . Alice and Bob

题意:Alice与Bob进行取石子游戏,规则为从一堆中去n个石子从另外一堆中取n*k个石子,不能取者输掉游戏,问谁获胜。

简要思路:暴力求解SG数组,对于每种取石子方案最多只有一种方式BoB会获胜。

代码实现:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int INF = 0x3f3f3f3f;
bool f[5050][5050];
void func(int x, int y){
	//通过x累加,第一重循环代表每次增加的大小,从1开始
	for(int i = 1;x + i <= 5000;i++){
		//第二重代表另外的数多加多少倍x增加的数
		for(int j = 0;y + j * i <= 5000;j++){
			f[x + i][y + j * i] = true;//遇到的数就标记
		}
	}
	//通过y累加
	for(int i = 1;y + i <= 5000;i++){
		for(int j = 0;x + j * i <= 5000;j++){
			f[x + j * i][y + i] = true;
		}
	}
	return ;
}

void init(){
	for(int i = 0;i <= 5000;i++){
		for(int j = 0;j <= 5000;j++){
			if(!f[i][j])func(i,j);
		}
	}
	return ;
}
signed main(){
	init();
	int t;
	scanf("%d",&t);
	while(t--){
		int n,m;
		scanf("%d %d",&n,&m);
		if(f[n][m] == true)printf("%s\n","Alice");
		else printf("%s\n","Bob");
	}
	system("pause");
	return 0;
}
posted @ 2021-07-18 14:31  0xYuk1  阅读(186)  评论(0)    收藏  举报