输入
输出
Bob
Alice
Bob
Bob
Alice
解题思路
要做这个题首先要明确必败态和必胜态的概念,因为这个游戏不存在平局的情况,所以如果不是必败态那么至少存在一种情况,使得一名玩家通过该策略一定可以赢得比赛,即必胜态
已知(0,0)和(2,3)为必败态,那么如果存在一次操作能到达这两种状态,即让后手面对必败态
所以我们可以遍历整个5000个数据 ,如果存在有两个点i,j 使得经过操作后能达到必败态
那么当前点为必胜态
AC代码
#include <bits/stdc++.h>
using namespace std;
const int N=5010;
int t,xx,yy;
bitset<N>dp[N];//此处借用了一位佬的bitset,开始WA了好久
int main() {
for(int temp=0;temp<10010;temp++)//此处进行优化可以大幅降低复杂度
for(int i=max(0,temp-5005),j=temp-i;i<5005&&j>=0;i++,j--){
if(!dp[i][j]) {
for(int x=1;x+i<=5000;x++)
for(int y=0;y*x+j<=5000;y++)
dp[i+x][j+x*y]=1;
for(int x=1; j+x<=5000;x++)
for(int y=0; x*y+i<=5000;y++)
dp[i+x*y][j+x]=1;
}
}
scanf("%d",&t);
while(t--) {
scanf("%d %d",&xx,&yy);
if(dp[xx][yy]==1) puts("Alice");
else puts("Bob");
}
}