zoj 1913 Euclid's Game
来源:互联网 发布:java 实体类命名规范 编辑:程序博客网 时间:2024/04/29 05:04
/*zoj 1913 博弈思路:递推 举25 7为例,则代码中的vector中为3 1 1 3(大的数对小的数反复取整所得) 不妨把最后的获胜者标记为a,则vector中最后一个元素看起,3必定为a 取整,递推知道倒数第二个元素1为b(代表令一个人),第二个元素1为 a,剩下第一个元素3。要注意的是a是获胜者。假设整个3都是b所取整的, 那么b完全可以把第一个3拆分成一个2和一个1,他取2,从而逼迫a取1, 这样最后是b获胜,矛盾了。所以我们要把第一个3拆分成2,1。递推知道2为a 所取,即取第一步的是a,即a是stan,stan获胜。*/#include <iostream>#include <cstdio>#include <vector>using namespace std;vector <int>v;int main(){ int m,n,i; bool id; while( cin>>m>>n && ( m || n ) ) { v.clear(); while( m!=0 && n!=0 ) { if( m>n ) { v.push_back( m/n ); m%=n; } else { v.push_back( n/m ); n%=m; } } if( v.size()==1 ) { cout<<"Stan wins\n"; continue; } id=0; for( i=v.size()-2;i>=0;i-- ) { if( v[i]>1 ) { if( id==1 ) id=0; continue; } id=!id; } if( id==0 ) cout<<"Stan wins\n"; else cout<<"Ollie wins\n"; } return 0;}