题目链接:
为了讨论方便,这里假设给定的两个整数x,y满足x≥y。
设x=qy+r。
显然,玩家只能从(x, y)到(x-y, y),(x-2y, y),……,(x-(q-1)y, y)和(y, r)。
设SG(x, y)表示两整数为x和y时的局面的SG函数值。
前q-1项就是只有一堆且这一堆含有q-1个石子的取石子游戏,因此SG(x, y)可初步判断为q-1。
而SG(x, y)是不能等于SG(y, r)的,因此,我们判断这q-1项是否包含SG(y, r)或者SG(y, r)=q-1,即q>SG(y, r)是否成立。若成立,则SG(y, r)应为q,否则SG(y, r)=q-1。
边界条件:SG(a, 0)=0,其中a是任意整数。
AC代码如下:
#ifndef _GAME_OF_EUCLID_
#define _GAME_OF_EUCLID_
#include<cstdio>
#define SWAP(x,y) x^=y^=x^=y
const char* S="Stan wins";
const char* O="Ollie wins";
int play(int,int);
int main(){
int x,y