POJ 2348

http://acm.pku.edu.cn/JudgeOnline/problem?id=2348

 

#include <iostream>

 

using namespace std;

 

long long m[1000];

 

/*

高人的思路(服了):

解法分析:

例如:

27 5

可以27-5*1,27-5*2,27-5*3,27-5*4,27-5*5;

27-5*i,i<5时, 下一次仍然只能取5

因此, 可以看作是有一堆个数为[27/5]=5的石子,

两人轮流取完这堆这后,又有一堆数目为[5/2]=2的石子,

接下来就是一堆数目为[2/1]=2的石子,然后就取完了.

现在, 问题就变成 ,已知大小的N堆石子, 依次取完每堆中的石子,个数不限(但只能在一堆中取), 取得最后一堆的人胜.

如果第一堆中石子的个数大于1,则先取者必胜, 因为,如果取完第一堆的人有必胜法, 则他可以取直接取完第一堆, 如果取完第一堆者必败, 则他可以让第一堆只剩一个子, 这样, 败局就落到对手的头上.

由此推出, 谁能够首先碰到一堆数目大于1 的(前几堆都只有一个), 谁就胜.

就是这样了.

*/

 

int main()

{

         long long a,b,tmp,i,r;

         while(cin>>a>>b,a)

         {

                   if(a<b)

                   {

                            tmp=a;

                            a=b;

                            b=tmp;

                   }

                   long mc=0;

                   do

                   {

                            m[mc++]=a/b;

                            r=a%b;

                            tmp=b;

                            b=a%b;

                            a=tmp;

                   }

                   while(r);

                   for(i=0;i<mc&&m[i]==1;i++);

                   if(i>=mc)

                   {

                            if(i%2) cout<<"Stan wins"<<endl;

                            else cout<<"Ollie wins"<<endl;

                   }

                   else

                   {

                            if(i%2) cout<<"Ollie wins"<<endl;

                            else cout<<"Stan wins"<<endl;

                   }

         }

         return 0;

}

posted on 2010-03-05 10:16  liugoodness  阅读(495)  评论(0编辑  收藏  举报

导航