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
题意:有两个数a,b,用大数减去小数的倍数,先有一个变成0的那个人获胜。
思路:有三种情况(假设a为大数):
1,如果a%b==0,那肯定是先手赢。
2,如果a<2*b,那么下一步只能变成(a-b,b),那么赢得几率是相互交替的。
3,如果a>2*b,那么肯定是先手赢,因为总可以转变成(a,a%b)和(a,a%b+b)的状态,因为这两种状态和第二种情况是相邻的,所以肯定有一种处于必败状态,先手只要找到这种状态即可。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
typedef long long LL;
int main()
{
LL a,b;
int flag=0;//对于第二种交替情况,看谁赢。
while(~scanf("%lld %lld",&a,&b)){
if(!a&&!b) break;
flag=0;
for(;;){
if(a<b) swap(a,b);
if((a%b==0)||(a>2*b)) break;
a-=b;
flag=1-flag;
}
if(!flag)
printf("Stan wins\n");
else
printf("Ollie wins\n");
}
return 0;
}
原文:http://blog.csdn.net/u013486414/article/details/44258819