中北大學NUC2017新生賽1001/NOJ-1981
題目:
熊孩子的樂趣
時間限制: 1000ms 記憶體限制: 65535KB
通過次數: 8 總提交次數: 12
問題描述
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
樣例輸入2 15 3 100 24樣例輸出
Alice Bob
思路:博弈論水題。
擷取有關本題部分:
巴什博弈
1、問題模型:只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取一個,最多取m個,最後取光者得勝。
2、解決思路:當n=m+1時,由於一次最多隻能取m個,所以無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝,所以當一方面對的局勢是n%(m+1)=0時,其面臨的是必敗的局勢。所以當n=(m+1)*r+s,(r為任意自然數,s≤m)時,如果先取者要拿走s個物品,如果後取者拿走x(≤m)個,那麼先取者再拿走m+1-k個,結果剩下(m+1)(r-1)個,以後保持這樣的取法,那麼先取者肯定獲勝。總之,要保持給對手留下(m+1)的倍數,就能最後獲勝。
3、變形:條件不變,改為最後取光的人輸。
結論:當(n-1)%(m+1)==0時後手勝利。
#include<bits/stdc++.h> typedef long long ll; using namespace std; int main(){ ios::sync_with_stdio(false); int t; cin>>t; while (t--){ int n,m; cin>>n>>m; if( n%(m+1) == 0){ printf("Bob\n"); } else printf("Alice\n"); } return 0; }