标签:poj2348 euclids game 博弈 数论
Description
25 7 11 7 4 7 4 3 1 3 1 0
Input
Output
Sample Input
34 12 15 24 0 0
Sample Output
Stan wins Ollie wins
题目大意:
给两个数,两人依次取,规则是:每次从大的数那取(两数目相等时任选其一),取的数目只能为小的数的正整数倍。最后取完其中一个数的胜。问给定情况下先手胜负情况。
分析:
现有状态(x,y) (设x>0且y>0,其它情况自行考虑)
(1)当x==y时,显然先手胜
(2)不妨设x<y
那么(x+y,y)的下一步必定为(x,y),所以(x+y,y)和(x,y)的结果必然
相反,其中有一种状态可以先手胜,另一种后手胜
对于任意k>=2,状态(x+ky,y)可以通过从x+ky那堆去掉(k-1)y个石子
变成(x+y,y),也可以通过从x+ky那堆去掉ky个石子变成(x,y),
于是这两种选择(注意:这是自主的选择)必然有一种可以获胜,
所以当k>=2时(x+ky,y)必胜 注意这里的数据范围要用long long
转载请注明出处:寻找&星空の孩子
题目链接:http://poj.org/problem?id=2348
#include<stdio.h> #include<algorithm> #define LL long long using namespace std; LL cnt; void fun(LL x,LL y) { cnt++; if(x==y||x>=2*y) return ; else fun(y,x-y); } int main() { LL n,m; while(scanf("%lld%lld",&n,&m),n+m) { cnt=0; if(n<m)swap(n,m); fun(n,m); if(cnt%2!=0) printf("Stan wins\n"); else printf("Ollie wins\n"); } return 0; }
还有一种更加睿智的思路:
http://www.cnblogs.com/goodness/archive/2010/03/05/1678892.html
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:poj2348 euclids game 博弈 数论
原文地址:http://blog.csdn.net/u010579068/article/details/47299909