題目大意:有n堆石子,第i堆有ai個。每次可以選擇乙個x,選擇乙個質數p滿足p|x,選擇乙個0< y<=a(x),然後將y個石子從x移動到x/p。問先手有多少種第一步移動的測率能夠必勝?答案除以總方案數輸出。n≤
106,0
≤ai≤
109n ≤10
6,0≤
ai≤10
9題解:
從最簡單的情況推導,什麼情況下是必勝/必敗。
只有質數字置上有值那麼這就是最樸素的nim遊戲。
考慮如果只有p^0,p^1,…,p^k有值,那麼這就是階梯nim遊戲。
考慮用階梯nim遊戲的正確性證明闡述這個問題(樸素的階梯nim遊戲是條鏈,但是稍作推廣就能發現這也適用於這個二分dag。),發現幾乎是相同的,那麼結論就是所有指數之和為奇數的a的異或和s=0,則為必敗。考慮這個題的計數。
首先如果s=0那麼先手必敗無論如何都贏不了直接輸出0走人。
否則列舉所以指數之和為奇數的x,看能否將其變成y< x,使得(s^x)^y=0,也就是是否(s^x) < y,這樣就做完了……是不可能的。
因此如果當前s> 0,正常的先手的確不會閒著沒事去動偶數層的東西(有可能會從必勝態變為必勝),而每次都是後手動了這些東西先收才會動。但是這個題裡面還是有可能先手傻了吧唧的動了偶數層又歪打正著的變成了先手必敗,要考慮這種情況,和上一種情況類似。
#include
#include
#include
#include
#define lint long long
#define mod 998244353
#define n 1000010
#define gc getchar()
#define debug(x) cerr<<#x<<"="<#define sp <<" "
#define ln inline int inn()
int p[n],c[n],d[n],a[n],cnt,np[n];
inline int fast_pow(int
x,int k,int ans=1)
inline int prelude(int n)}}
return0;}
int main()
博弈論 取石子(反 Nim 博弈)
alice與bob在一起玩乙個遊戲。現在有乙個字串s,每個人可以選擇字串中的某乙個區間和一種字元,刪除這個區間內的所有該字元 需要刪除字元的數量至少為1 從alice開始,alice與bob輪流進行進行這個操作,若在某個玩家刪除前,字串已經為空,則該玩家獲勝。假設alice和bob都會按照其最優的解...
博弈論 Nim遊戲
這種遊戲稱為nim博弈,遊戲過程中面臨的狀態成為局面。n im nimni m博弈不存在平局,只有先手必勝和先手必敗兩種情況。定理nim 博弈先手 必勝,當 且僅當a 1xora2 xor xoran 0nim博弈先手必勝,當且僅當 a 1 texta 2 text cdots text a n n...
石子遊戲 博弈論
有n n 堆石子,兩人輪流取石子,每次可以將一堆全部拿走,也可以選擇其中y y 個拿,但是要求y y 與這堆石子的總個數互質。求誰會勝利。明顯的博弈論之s g sg 函式。我們可以發現,質數的s g sg 值就等於上乙個質數的s g sg 值加一,而合數的s g sg值就是它的最小質因子的s g s...