NOIP2023模拟10联测31 游戏

题目大意

Alice \text{Alice} Alice Bob \text{Bob} Bob在玩一个游戏:有一个由正整数组成的集合 S S S,两人轮流从中选数, Alice \text{Alice} Alice先手。每次一个人可以从当前集合中选一个数 x x x,把 x x x以及 x x x在集合中所有的因数从集合中删除,注意 x x x必须在集合中。当一个人无法选数(也就是集合为空)时这个人就输了。问一开始集合为 { x ∣ 1 ≤ x ≤ n , ϕ ( x ) ≤ m } \{x|1\leq x\leq n,\phi(x)\leq m\} {x∣1xn,ϕ(x)m}时,当双方都采用最优策略时,谁会获胜。

如果 Alice \text{Alice} Alice会获胜,则输出 Alice \text{Alice} Alice;否则,输出 Bob \text{Bob} Bob

1 ≤ n ≤ 100 , 0 ≤ m ≤ n 1\leq n\leq 100,0\leq m\leq n 1n100,0mn


题解

如果初始集合为空(即 m = 0 m=0 m=0),则后手胜。

如果初始集合非空的话,则 1 1 1一定在集合中。我们考虑先手不选 1 1 1的话能否获胜。

  • 如果先手不选 1 1 1能获胜,则先手必胜
  • 如果先手不选 1 1 1必败,那么先手就选 1 1 1,给后手留下了一个不能选 1 1 1的必败的局面

你也许会觉得,一开始不能选 1 1 1的局面中有 1 1 1,但先手选 1 1 1之后留下的局面没有 1 1 1了,两个局面不一样,所以前一个必败不能说明后一个必败。但是这两个局面的前提都是不能选 1 1 1,而且不管选什么, 1 1 1都会被删除,后面同样也不能选 1 1 1,所以两个局面是等价的。

也就是说,如果 m = 0 m=0 m=0,则输出 Bob \text{Bob} Bob;否则,输出 Alice \text{Alice} Alice

code

#include
using namespace std;
int n,m;
int main()
{
//	freopen("game.in","r",stdin);
//	freopen("game.out","w",stdout);
	scanf("%d%d",&n,&m);
	if(m==0) printf("Bob\n");
	else printf("Alice\n");
	return 0;
}

你可能感兴趣的:(题解,题解,c++)