題目
鏈接:https://ac.nowcoder.com/acm/problem/247578
來源:牛客網題目描述
牛牛和牛妹在玩游戲,他們的游戲規則是這樣的:
一共有兩堆石子,第一堆有 aaa 個,第二堆有 bbb 個,牛牛和牛妹輪流取石子,牛牛先手,每次取石子的時候只能從以下 222 種方案種挑一種來取(對于選擇的方案數必須保證當前石子 ≥\ge≥ 取的石子個數才能取):
\1. 第一堆取 111 個,第二堆取 222 個
\2. 第一堆取 222 個,第二堆取 111 個
誰先無法取石子,誰就輸了。假設牛牛和牛妹都很聰明,請問誰會獲勝?輸入描述:
第一行輸入一個正整數 T(1≤T≤105)T(1 \le T \le 10^5)T(1≤T≤105) ,代表數據組數。 接下來 TTT 行,每行輸入兩個整數 a,b(1≤a,b≤1018)a,b (1 \le a,b\le 10^{18})a,b(1≤a,b≤1018) 代表兩堆石子的數量。輸出描述:
對于每組數據,輸出一行,代表勝利者的名字(牛牛獲勝輸出niuniu,牛妹獲勝輸出niumei)。? 示例1
輸入
[復制](javascript:void(0)??
2 1 2 3 3輸出
[復制](javascript:void(0)??
niuniu niumei
思路 博弈-對稱策略
不考慮玩家1取什么棋子,玩家二只要和其策略不同,便可以使一個回合(兩個人都下了棋)后,兩堆石子總數都減3,那么我們考慮\(min(a, b)\), 只要若干回合后,棋子a和b都減少3,所以\(min(a, b)\)石子提前撿到0,那么p1必敗。所以若\(min(a,b)\) % 3 == 0,則玩家2只要對稱下就能贏,若\(min(a, b)\) % 3 > 0,則玩家1可以構造出必敗棋給玩家2,玩家1能贏。
若玩家1構造不了必敗棋,即選哪個策略都是\(min(a, b) % 3\)都大于0,那么相當于丟給玩家2的一定是必勝棋了,此時玩家1必敗,否則相反面等于0,丟給玩家2的一定是必敗棋,玩家1必勝。
Code
#include <iostream>
#define xian puts("niuniu")
#define hou puts("niumei")
using namespace std;
int main() {
int t;
cin >> t;
while(t --) {
long long a, b;
cin >> a >> b;
// 1,2 1,1 同樣滿足所以不考慮邊界
if(min(a - 1, b - 2) % 3 == 0 || min(a - 2, b - 1) % 3 == 0) xian;
else hou;
}
}
浙公網安備 33010602011771號