Euclid's Game HDU - 1525
考察:博弈论 找规律
思路:
数字太大了,sg函数求不出来,因此只能先打表找规律(然后什么都没看出来) 看了网上的题解才懂怎么找...= =
先分类几种情况:
- a%b==0,先手必胜
- a>b&&b<a<2b. 此时难以直接判定胜负,需要模拟,此时a只有一种选择.达到判定条件退出.
- 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函数还未复习完.