Euclid's Game
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 0 Accepted Submission(s) : 0
25 7
11 7
4 7
4 3
1 3
1 0
an Stan wins.
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b)&&(a||b))
{
if(a<b)swap(a,b);
int flag=1;
while(1)
{
if(a==b||a/b>=2)
break;
a=a-b;
swap(a,b);
flag=!flag;
}
if(flag)
printf("Stan wins
");
else
printf("Ollie wins
");
}
return 0;
}
方法二:
给两堆石子(题目中是数,配合一下上文这里说石子),两人依次取石子,规则是:
每次从石子数较多的那堆取(两堆石子数目相等时任选一堆),取的数目只能为石子少的
那一堆的正整数倍。最后取完一堆石子者胜。问给定情况下先手胜负情况。
多列几项就会发现一个熟悉的身影:斐波拉契数列。最后的结论是如果两个数相等,或者两数之比大于斐
波拉契数列相邻两项之比的极限((sqrt(5)+1)/2),则先手胜,否则后手胜。
#include<stdio.h>
#include <math.h>
int main()
{
int a,b;
double c=(1.0+sqrt(5.0))/2.0;
while(scanf("%d%d",&a,&b)!=EOF && (a ||b))
{
if(a==b)
{
printf("Stan wins
");
continue;
}
if(a<b)
{
a=a^b;
b=a^b;
a=a^b;
}
if((double)a/b>c)
printf("Stan wins
");
else
printf("Ollie wins
");
}
}