LG1290 歐幾里德的遊戲
阿新 • • 發佈:2021-07-29
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 }