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 #include2 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(m n; 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 }