P1290 题解
看到下面有些dalao的证明十分严谨(然而也有点萌新不友好),却也有一些dalao过程不是那么严谨(请原谅我的措辞)。
所以我决定写一篇稍稍平均一点的题解,即尽力做到清楚地解释。
这道题有一个很快的方法。记当前状态为
假定
若
此时,轮到对手操作。因为必须要取正整数堆较小的,所以只能转移到
若
因此,在搜索时向后的决策就只有一个了:若
这种方法的时间复杂度是多少呢?不难发现,当
下面是代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int dfs(int a,int b,int p){//0表先手(1),1表后手(2);
if(b==a)return 1;//等于也直接胜利
if(b/a>=2)return 1;//不小于2直接胜利
else return 1^dfs(b-a,a,p^1);//继续往下,轮到对手
}
int n,m,t;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);
if(dfs(n,m,1)==0)printf("Ollie wins\n");
else printf("Stan wins\n");
}
}