原题链接

题目大意

有三堆苹果,苹果个数分别为M,N,N
Alice和Bob两个人要按照一定的规则依次从这三堆中取走苹果,最后将苹果拿光的人将获得胜利,取苹果的规则如下:
1.选择一堆苹果,并从中取走不超过$S$个苹果
2.从每一堆苹果中拿走相同数目的苹果(可以超过$S$),如果某一堆的苹果不够拿则不能采取这种取法
每次开始均由Alice先取

解题思路

设三堆苹果的状态表示为$(A,B,C)$

  1. M<N的情况下,先手必胜
    可先手从每堆中拿走$M$个苹果,$(M,N,N)->(0,N-M,N-M)$
    之后变为nim博弈中的先手必输局面,后手只需维持两堆数量的平衡即可胜利。
  2. M=N的情况下,先手必胜
    从每堆中直接拿走$M$个苹果$(M,M,M)->(0,0,0)$
  3. M>N的情况下
    • 当$M=k*(s+1),N<S+1$时则后手必胜
    • 反之则先手必胜
      =.=只有一种情况后手能赢呗就是

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;


int main(){
ll S,M,N;
while(cin>>M>>N>>S){
if(M%(S+1)==0 && N<S+1){
cout<<"Bob"<<endl;
}
else cout<<"Alice"<<endl;
}
}