疫情當下,有兩個很無聊的人,小a和小b,準備玩乙個遊戲,玩法是這樣的,從兩個自然數開始比賽。第乙個玩家小a從兩個數字中的較大者減去兩個數字中較小者的任何正倍數,前提是得到的數字必須是非負的。然後,第二個玩家小b對得到的兩個數字做同樣的處理,兩個玩家交替進行,直到乙個玩家能夠從大的數字中減去較小數字的倍數,達到0,從而獲勝。例如,玩家可以從(25,7)開始 :
25 7
a 11 7
b 4 7
a 4 3
b 1 3
a 1 0
這是個 小a 獲勝的例子.
input
多組輸入,不超過6組。每行為一組資料,包含兩個正整數m,n(m,n<2^31)。
output
對於每一行輸入,輸出一行,若小a獲勝,那麼輸出「stan wins」否則輸出「ollie wins」。假設這兩個玩家都玩得很好。最後一行輸入包含兩個零,不應進行處理。
sample input
34 12
15 24
0 0sample output
stan wins
ollie wins
博弈:歐幾里得的遊戲
1.假設m>n,若m是n的整數倍,即m%n=0時小a必勝。
2.如果m>2n時,則可能存在兩種狀態:
舉個栗子:m=38 n=9
第一種取法
a 38中取4個9
b 去取9和2
…第二種取法
a 38中取3個9
b 11中取1個9
a 去取9和2
…可以看出通過這個取法a就掌握了主動權,a就可以控制局勢。
因為兩個玩家足夠聰明,每個玩家肯定會用對自己最有利的取法,所以出現這種狀態時,先手(小a)必勝。
3.如果m>0&&m<2n 因為取法只有依次取所以我們就依次取。
也就是說,當存在maxx>=2*minn時,就會出現小a(stan)必勝的結果,若不存在,就通過迴圈判斷知道結束進行了幾輪遊戲,如果是奇數次為小b(ollie)獲勝,反之小a(stan)獲勝。
#include
#include
#include
#include
#include
#include
using
namespace std;
intmain()
if(flag %2==
1)printf
("ollie wins\n");
else
printf
("stan wins\n");
}}
以上為自己見解。。。
另附大佬的見解:
當m>2*n時,若為a的回合,則一定可以取成m%n + n ,那麼下回合 (m%n + n,n),此時n小,則下回合取的人只能取為(m%n,n),那麼下回合就必勝。經歷了兩回合,所以還是a必勝
2020NYIST個人積分賽第四場 F
原題鏈結 hihocoder 1032 就是最長回文子串 sample input 3abababa aaaabaa acacdas sample output75 3以某個位置為中心位置,向兩邊擴充套件判斷是否是回文串,再判斷是否為最長回文串 注意邊界處理 include include incl...
2020NYIST個人積分賽第六場 D
題意 給n個點,m條邊,讓構建乙個有向無環無重邊的圖,並且圖的最短路是素數,最小生成樹也是素數。思路 題意的可塑造性很強,我們可以讓最小生成樹就是最短路,呢麼我們現在就是給最小生成樹找乙個素數,很明顯最小生成樹的素數範圍在 1,1e14 1,1e14 1,1e1 4 所以預處理1 1e14不太可能,...
2020NYIST個人積分賽第六場 H
我看沒人寫這題題解,那本菜雞來寫一下 題意 給長度為n的序列,m次詢問,每次詢問區間 l,r l,r l,r 中有多少數符合該數出現的個數等於它本身 思路 這題的題意非常符合莫隊演算法 莫隊演算法的時間複雜度是o n sqrt n o nsqrt n o nsqr t n 所以如果常數很大的話,會t...