51nod 1185 威佐夫遊戲 V2

2021-08-18 06:09:54 字數 1808 閱讀 6707

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

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

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

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

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

3

3 53 4

1 9

b

aa

威佐夫博弈,關鍵主要是對於精度的處理,這裡將(0.)618033988,749894848,204586834先儲存在陣列tmp中,則其與另乙個數x相乘便可轉化為 x*tmp[0]/mod+x*tmp[1]/mod/mod+x*tmp[2]/mod/mod/mod(mod=1e9),①

又∵ x=(x/mod)*mod+x%mod,令m=x/mod,n=x%mod

則①式可轉化為

(m*tmp[0]+n*tmp[0]/mod)+(m*tmp[1]/mod+n*tmp[1]/mod/mod)+(m*tmp[2]/mod/mod+n*tmp[2]/mod/mod/mod),

繼續轉化則有 m∗

tmp[

0]+(

n∗tm

p[0]

+m∗t

mp[1

]–––

––––

––––

––––

––––

––––

+(n∗

tmp[

1]+m

∗tmp

[2]–

––––

––––

––––

––––

––––

––+n

∗tmp

[2]/

mod–

––––

––––

––––

––)/

mod–

––––

––––

––––

––––

––––

––––

––––

––––

––––

––––

––––

–––)

/mod

. m∗t

mp[0

]+(n

∗tmp

[0]+

m∗tm

p[1]

_+(n

∗tmp

[1]+

m∗tm

p[2]

_+n∗

tmp[

2]/m

od_)

/mod

_)/m

od

.此題需要乘以1.618……,最後再加上乙個差值即可.

#include

using

namespace

std;

typedef

long

long ll;

#define io ios::sync_with_stdio(false);\

cin.tie(0);\

cout.tie(0);

ll tmp[3] = ;

const ll mod= 1e9;

int main()

51nod 1185 威佐夫遊戲 V2

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

1185 威佐夫遊戲 V2

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

51Nod 威佐夫遊戲

1072 威佐夫遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 有2堆石子。a b兩個人輪流拿,a先拿。每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出2堆石子的數量,問...