【ACM】熊孩子的樂趣
【問題描述】
Alice跟Bob是學校裡出了名的兩個熊孩子,會在任何事情上爭個高低,彼此都不服輸。幼兒園的老師每次分糖果的時候看到這兩個熊孩子也很頭疼,兩個人都想佔便宜,爭個你勝我負,老師還要想辦法來安慰輸了的一方。
老師每次會拿n個糖果來分給Alice跟Bob,老師規定了每人每次最多隻能在盤子裡拿走m個糖果(小朋友每次至少都要拿一個),由於Alice是女孩子,所以每次由Alice先從盤子裡拿,然後是Bob。Alice跟Bob數學不好,他們並不知道拿的多的人是佔便宜的一方,他們認為拿走最後一個糖果的人是勝利者,這樣可以扮鬼臉來嘲對方。
老師這可發愁了,他不知道每天分糖果的時候Alice跟Bob誰勝誰負,總得有個準備去安慰下哭鼻子的那個。老師希望你可以幫幫他,提前算出每次分糖果誰會贏。(假設Alice跟Bob每次決定拿走糖果數量的目的都是為了讓自己可以成功拿走最後一個,成為最後的贏家)。
【輸入描述】
第一行輸入一個T,表示有T組測試資料。
對於每組測試資料,包含兩個正整數n,m。(1<=n,m<=1000000000)
【輸出描述】
先手:Alice
後手:Bob
輸出一行 Alice OR Bob
巴什博弈
只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取一個,最多取m個。最後取光者得勝。
顯然,如果n=m+1,那麼由於一次最多隻能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現瞭如何取勝的法則:如果n=(m+1)r+s,(r為任意自然數,s≤m),那麼先取者要拿走s個物品,如果後取者拿走k(≤m)個,那麼先取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以後保持這樣的取法,那麼先取者肯定獲勝。總之,要保持給對手留下(m+1)的倍數,就能最後獲勝。
所以在本題中,只要 n%(m+1)==0,那麼一定是後者勝利
#include <stdio.h>
int main ()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
if(n%(m+1)!=0) printf("Alice\n");
else printf("Bob\n");
}
return 0;
}