标签:
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