pku 2348 Euclid's Game(博弈)

这题的解法实在是精妙。
对于任意一个局面(a,b),它是必胜局还是必败局这是确定的。但按这题的要求,如果要我们自己来判断却会极其难。
对于局面(m,n)(m>n),两人一直往下取,必然会到局面(m%n,n)。
如果m/n<2,则此时只有一种往下走的方法,下一步必然是(m%n,n)。
如果m/n>2,则局面(m,n)的先取者就可以决定由谁去面对局面(m%n,n),因为这个先取者足够聪明可以判断(m%n,n)是必胜还是必败,因此我们也已经可以确定(m,n)的先取者已经胜了。

#include <algorithm> #include <iostream> using namespace std; bool stanwin; int a,b; void output() { if(stanwin) printf("Stan wins/n"); else printf("Ollie wins/n"); } int main() { while(scanf("%d%d",&a,&b)&&(a||b)) { stanwin=true; while(1) { if(a>b) swap(a,b); if((b/a>=2)||(b%a==0)||(a==0)) {output(); break;} b=b-a; stanwin=!stanwin; } } return 0; }

你可能感兴趣的:(output)