2021牛客暑期多校训练营1.Alice and Bob
题意:两人博弈,两堆石头,每次操作,从一堆取 k 个(k>0),同时从另一堆取ks个(s>=0),拿走场上最后石子的人胜利。
思路:由所有已有的先手必败状态,筛选出新的状态,若(i,j)先手必败,则(i+x,j+xy)和(i+x*y,j+x)为先手必胜
#include<bits/stdc++.h>
using namespace std;
bool vis[5005][5005];
void pre()//预处理
{
for(int i=0;i<=5000;i++){
for(int j=0;j<=5000;j++){
if(!vis[i][j]){
for(int x=1;i+x<=5000;x++){
for(int y=0;j+y*x<=5000;y++){
vis[i+x][j+x*y]=1;
}
}
for(int x=1;j+x<=5000;x++){
for(int y=0;i+x*y<=5000;y++){
vis[i+x*y][j+x]=1;
}
}
}
}
}
}
int main()
{
int t,n,m;
pre();
cin>>t;
while(t--){
scanf("%d%d",&n,&m);
if(vis[n][m]){
printf("Alice\n");
}
else{
printf("Bob\n");
}
}
return 0;
}