poj 2348

题目:http://poj.org/problem?id=2348

题意:给出两个数 n 和 m,两个人轮流操作,每次用上一次的结果中大的减去小的 x 倍(当然得到的数不能为负数),这样直到某个人无法操作时,即为输者,求谁是必胜者

从网上看的一个思路:对于任意的两个数 比如说是 25 7 ,可以拿走 1 * 7个 , 2 * 7个 3 * 7个,每次拿走的是 7 * i 个,如果 i < 3, 那么对于下一个人,他还是的 拿 7 * j (j > 0 && j < 3 - i)个,也就是说必须把 这 3 * 7 个都拿完(4,7),才可以 开始 4个 4个的拿,也就是我们可以把 给的数从新分堆,每次堆的大小为 n / m,(假设 n >= m) 直到 m 为 0,如果谁先遇到 哪一堆的石子数是大于 1的那么这个就是必胜者, 博主是这样说的 :

如果第一堆中石子的个数大于1,则先取者必胜, 因为,如果取完第一堆的人有必胜法, 则他可以取直接取完第一堆, 如果取完第一堆者必败, 则他可以让第一堆只剩一个子, 这样, 败局就落到对手的头上. 由此推出, 谁能够首先碰到一堆数目大于1 的, 谁就胜. http://www.cnblogs.com/goodness/archive/2010/03/05/1678892.html

如果都没有遇到 > 1的那么就看 num 的奇偶了,但是这个特殊情况可以归结到 先遇到 > 1 的 num 的奇偶情况里

 

View Code
 1 int main()
 2 {
 3     int n,m;
 4     while(scanf("%d%d",&n,&m))
 5     {
 6         if(n == 0 && m == 0) break;
 7         int sum,num = 0;
 8         if(n == 0 || m == 0) {printf("Ollie wins\n");continue;}
 9         if(n < m) {int temp = n;n = m;m = temp;}
10         while(m)
11         {
12             sum  = (n / m);
13             int tem = m;
14             m = n % m;
15             n = tem;
16             num ++;
17             if(sum > 1) break;
18         }
19         if(num % 2 == 0) printf("Ollie wins\n");
20         else printf("Stan wins\n");
21     }
22     return 0;
23 }

 

 

 

 

posted @ 2012-11-15 16:51  AC_Girl  阅读(302)  评论(0编辑  收藏  举报