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 }