2020NYIST個人積分賽第二場 A

2021-10-23 03:33:07 字數 1445 閱讀 1952

疫情當下,有兩個很無聊的人,小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...