bzoj2281 黑白棋 博弈論

2021-07-08 15:13:05 字數 1004 閱讀 2038

這道題目的轉化真是巧妙啊。不過據說題目有點問題,那就不管了。首先將第i個白子和第i個黑子組成一對。那麼這一對中,白子的左移是沒有意義的,黑子的右移也是沒有意義的(雖然有反例,但好像只能這樣了)。那麼每一對黑子和白子可以看成一堆火柴,則問題轉化為一次在d堆中拿火柴的必勝策論。

對於d-nim(就這麼叫了)問題,有個結論是如果對於二進位制的每一位的抑或值x都有x≡0(mod d+1),那麼為必敗狀態,否則為必勝狀態。證明不會。。

然後就可以用f[i][j]表示到二進位制的第i位(從低到高),目前總和為j的必敗狀態方案數。注意j<=n-k。那麼f[i][j]可以轉移到f[i+1][j+x*(d+1)*2^(i)],注意有c(k/2,x*(d+1))種

組合方式。

最後統計必勝狀態。用所有的狀態c(n,k)減去所有的必敗狀態。在必敗狀態中,如果兩端的點都確定了,那麼j就確定了。不妨列舉這個j,然後在組合一下點的排列方式即可。

ac**如下:

#include#include#define ll long long

#define mod 1000000007

using namespace std;

int n,m,d,bin[25];

ll c[20005][205],f[25][20005];

ll c(int aa,int bb)

int main()

f[0][0]=1;

for (i=0; i<15; i++)

for (j=0; j<=n-m; j++)

for (int k=0; k*(d+1)<=m/2; k++)

ll ans=0;

for (i=0; i<=n-m; i++) ans=(ans+f[15][i]*c(n-m/2-i,m/2))%mod;

printf("%lld\n",(c(n,m)-ans+mod)%mod);

return 0;

}

by lych

2015.12.5

BZOJ2319 黑白棋遊戲

將01串按1分段,那麼分析可得長度為 a 的段拼上長度為 b 的段的sg值為 a a leq b 設 f i j k l 表示從後往前用了 i 個1,j 個0,當前段長度為 k 後面部分sg值為 l 的概率。同時預處理出 g i j k 表示 i 個1,j 個0的串,sg值為 k 的概率。那麼對於最...

bzoj4131 並行博弈 博弈論

題目大意 題目鏈結。注釋 略。想法 我們發現無論如何操作都會使得 1,1 發生改變。所以單個 acg 的勝利條件就是 1,1 是否為黑色。如果為黑色那麼可以讓它變成白的。接下來無論對手如何操作都可以通過翻轉 1,1 使得進入對手回合。那麼多個 acg 相加就是取異或和即可。code include ...

bzoj 1299 巧克力棒 博弈論

不考慮從盒子中拿出這一操作,則剩下的部分就是乙個nim遊戲。所以先手第一次只要拿到異或和為零的巧克力棒就必勝。因為若對手選擇吃巧克力棒,則是必敗局面。若選擇拿出巧克力,則新的異或和一定不為零,因為如果一組巧克力異或和為零,則先手可以第一次的時候拿出來。直接dfs就可以。include include...