Euclid's Game HDU - 1525

原题链接

考察:博弈论 找规律

思路:

        数字太大了,sg函数求不出来,因此只能先打表找规律(然后什么都没看出来) 看了网上的题解才懂怎么找...= =

        先分类几种情况:

  1. a%b==0,先手必胜
  2. a>b&&b<a<2b. 此时难以直接判定胜负,需要模拟,此时a只有一种选择.达到判定条件退出.
  3. a>2*b 此时先手必胜,我们假设a%b,b是必败态,先手可以让局势边成a%b+b(b<式子<2*b),b 此时后手只有变成必败态.若a%b,b是必胜态,那么先手明显获胜.
 1 #include <iostream>
 2 using namespace std;
 3 int n,m;
 4 int main() 
 5 {
 6     while(scanf("%d%d",&n,&m)!=EOF&&(n+m))
 7     {
 8         if(n<m) swap(n,m);
 9         if(n%m==0||n>2*m) { puts("Stan wins");continue;} 
10         bool ok = 1;
11         while(n%m!=0&&n<2*m)//条件少了一个就超时
12         {
13             n-=m;
14             swap(n,m);
15             ok = !ok;//ok = 0,break的话,先手必败 
16         }
17         if(ok) puts("Stan wins");
18         else puts("Ollie wins");
19     }
20     return 0;
21 }

 

2021.5.23 关于本菜狗复习一遍还是不会这件事.

博弈论...只能多测试了(.),sg函数还未复习完.

posted @ 2021-03-22 08:11  acmloser  阅读(14)  评论(0编辑  收藏  举报