LG1290 欧几里德的游戏


https://www.luogu.com.cn/problem/P1290

博弈论游戏,用到mod。

辗转相除法的过程,会构成n种状态。

到达最后一个状态就赢了。

对于一次过程如果div>1那么只要把该状态下的最后一个留给对方,自己始终是占据状态的初始位,那么一定是赢的。

第二种情况,如果div==1,那么只有一种状态,那么必然要把状态拱手相让。

对于a_i>1,....=1,a_j>1,如果说在这一过程里,j-i为偶数,那么中间会转移奇数次状态,那么a_j和a_{i+1}状态不同,那么只要把下一状态交给对方即可,全部取走即可。如果j-i为奇数,那么中间转移偶数次状态,a_j和a_{i+1}d的状态相同,按照原计划分配即可,保证始终为初状态。

所有对于以上两种情况都有对应的方案可以胜利。问题就在于谁先拿到>1.

而如果是连续的==1,则在不断的变换状态,只要不停的交换即可。

 1 #include
 2 using namespace std;
 3 typedef long long ll;
 4 ll m,n,k;
 5 int main()
 6 {
 7     ll c;
 8     scanf("%lld",&c);
 9     while(c--)
10     {
11         bool flag=true;
12         k=0;
13         scanf("%lld%lld",&m,&n);
14         if(mn;
15         while(m/n==1&&m%n)
16         {
17             ll t=m%n;
18             m=n;
19             n=t;
20             k=!k;
21         }
22         if(!k) printf("Stan wins\n");
23         else printf("Ollie wins\n");
24     }
25     return 0;
26  }