1. 程式人生 > 其它 >LG1290 歐幾里德的遊戲

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<bits/stdc++.h>
 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(m<n) m^=n,n^=m,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 }