威佐夫遊戲

2021-08-21 09:54:43 字數 1217 閱讀 3888

1072 威佐夫遊戲

基準時間限制:1 秒 空間限制:131072 kb 分值: 0 

難度:基礎題

有2堆石子。a b兩個人輪流拿,a先拿。每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出2堆石子的數量,問最後誰能贏得比賽。

例如:2堆石子分別為3顆和5顆。那麼不論a怎樣拿,b都有對應的方法拿到最後1顆。

input

第1行:乙個數t,表示後面用作輸入測試的數的數量。(1 <= t <= 10000)

第2 - t + 1行:每行2個數分別是2堆石子的數量,中間用空格分隔。(1 <= n <= 2000000)

output

共t行,如果a獲勝輸出a,如果b獲勝輸出b。
input示例

3

3 53 4

1 9

output示例

b

aa

這種情況下是頗為複雜的。我們用(a[k],b[k])(a[k] ≤ b[k] ,k=0,1,2,...,n)(表示兩堆物品的數量並稱其為局勢,如果甲面對(0,0),那麼甲已經輸了,這種局勢我們稱為奇異局勢。前幾個奇異局勢是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。注:

k表示奇異局勢的序號, 第乙個奇異局勢k=0。

可以看出,a[0]=b[0]=0,a[k]是未在前面出現過的最小自然數,而 b[k]= a[k] + k。

可根據規律求出奇異局勢

#include#include#include#include#include#include#include#include#include#include#define maxn 2000005

#define inf 0x3f3f3f

#define ll long long

#define mod 1000000007

#define mem(a,b) memset(a,b,sizeof(a))

using namespace std;

int a[maxn];bool vis[2*maxn];

void init()

}int main();

int main()

}

1072 威佐夫遊戲 威佐夫博弈模板

wythoff game 分割 先取完者贏 威佐夫博弈 每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取 乙個局面,讓你求是先手輸贏 差值 1.618 最小值的話後手贏,否則先手贏 乙個局面,讓你求先手輸贏,假設先手贏的話輸出他第一次的取法 首先討論在兩邊同時取的情況,很明顯兩邊同時取...

1072 威佐夫遊戲

1072 威佐夫遊戲 hdu1527 有2堆石子。a b兩個人輪流拿,a先拿。每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出2堆石子的數量,問最後誰能贏得比賽。例如 2堆石子分別為3顆和5顆。那麼不論a...

51nod 1072 威佐夫遊戲(威佐夫博弈)

有2堆石子。a b兩個人輪流拿,a先拿。每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出2堆石子的數量,問最後誰能贏得比賽。例如 2堆石子分別為3顆和5顆。那麼不論a怎樣拿,b都有對應的方法拿到最後1顆。...