题目:http://noi.openjudge.cn/ch0402/1350/
分析:
1.当n>=2*m-1时先手必胜:当n=2m显然胜。当n=2m-1,可以变成m-1,m然后此时先手必败,则原先手必胜。当n>2m,设n%m=r,则可以变成r,m或r+m,m 如果r,m必胜则r+m,m必败,即先手控场。
2.当n<2*m-1时:当n==m或m==1时先手必胜,当n==m+1先手必输,其余由n-m,m的状态推得。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
bool work(long long n,long long m)
{
if(n<m) swap(n,m);
if(n%m==0||n>=2*m-1||m==1) return true;
if(m==n-1) return false;
return !work(n-m,m);
}
int main()
{
long long n,m;
while(scanf("%lld%lld",&n,&m)&&n!=0)
{
if(work(n,m)==true) printf("Stan wins\n");
else printf("Ollie wins\n");
}
return 0;
}