SDOI 2011 黑白棋 題解

2021-10-24 13:40:15 字數 2753 閱讀 5110

題目傳送門

題目大意:有乙個 1×n

1\times n

1×n 的棋盤,上面有 k

kk 顆棋子,一半白一半黑,並且相鄰棋子顏色不同,兩個人輪流操作,乙個人只能將白棋子右移,乙個人只能將黑棋子左移,每個人一次最多移動 d

dd 顆棋子,問有多少種局面先手必勝(先手操作白棋子)。

將相鄰的一對黑白棋子看成一堆石子,他們之間的距離就是石子數量,那麼就一共有 k/2

k/2k/

2 堆 石子,變成了乙個 d

dd 階的 nim

nimni

m 遊戲。

考慮 1

11 階 nim

nimni

m 遊戲的必敗情況:假如所有石頭數量異或和為 0

00 則必敗,這等價於,將每堆石子數量轉化為二進位制數,然後對於所有 i

ii,第 i

ii 位為 1

11 的數的個數恰好為 2

22 的倍數。

類似的,d

dd 階 nim

nimni

m 遊戲的必敗情況就是:對於所有 i

ii,第 i

ii 位為 1

11 的數的個數恰好為 d+1

d+1d+

1 的倍數,證明也類似,因為 d

dd 階 nim

nimni

m 遊戲中,乙個人一次操作可以將任意位的 1

11 的個數減少 1

11 ~ d

dd 個,那麼每一位就是乙個 bas

hbash

bash

遊戲,所以如果都是 d+1

d+1d+

1 的倍數就必敗。

為了方便,先將 k

kk 除以 2

22,則 k

kk 的意義就變成了石子堆數。

求必勝局面數不好求,正難則反,考慮求出必敗局面數,總局面數顯然為 (n−

2∗k+

2∗k+

1−12

∗k+1

−1)=

(n2∗

k)

\binom =\binom n

(2∗k+1

−1n−

2∗k+

2∗k+

1−1​

)=(2

∗kn​

),即將空位插入到所有棋子中間。

設 f [i

]f[i]

f[i]

表示石子總數為 i

ii,分成 k

kk 份使先手必敗的方案數。考慮列舉每一位上 1

11 的總數(一定是 d+1

d+1d+

1 的倍數),然後將這些 1

11 用組合數分配到每個石子堆裡就可以了。最後統計答案時,f[i

]f[i]

f[i]

的貢獻為 f[i

]×(n

−2∗k

+k+1

−1k+

1−1)

f[i]\times\binom

f[i]×(

k+1−

1n−2

∗k+k

+1−1

​),組合數是表示將沒用到的空位放到 k

kk 堆石子的間隙中。

時間複雜度 o(13

n×nd

+1

)o(13n\times \frac n )

o(13n×

d+1n

​),當 d=1

d=1d=

1 時會被卡到 13n2

13n^2

13n2

,但是眾所周知理論時間複雜度和實際時間複雜度是兩個東西,所以我這個**不開 o2o2

o2洛谷rk3,開了 o2o2

o2在洛谷甚至以 22ms

22ms

22ms

能跑到rk1(目前)……

**如下:

#include

#include

#include

using

namespace std;

#define maxn 10010

#define mod 1000000007

int n,k,d;

int fac[maxn]

,inv[maxn]

,inv_fac[maxn]

;void

facinit()

intbinom

(int x,

int y)

int f[maxn]

,tmp[maxn]

;void

add(

int&x,

int y)

intmain()

}for

(int j=

0;j<=n;j++

)f[j]

=tmp[j]

,tmp[j]=0

;}int ans=0;

for(

int i=

0;i<=n;i++

)add

(ans,

1ll*f[i]

*binom

(n-i+k+1-

1,k+1-

1)%mod)

; ans=

(binom

(n,k*2)

-ans+mod)

%mod;

printf

("%d"

,ans)

;}

SDOI2011 黑白棋 題解

題目鏈結 題意略首現發現對於一次單獨的遊戲,是乙個取石子遊戲 共有 frac 堆石子,每次取至多 d 堆,每堆若干個,是個 text 遊戲。結論 將每堆石子的個數用二進位制表示。如果過每一位 1 的個數都能被 d 1 整除後手必勝,否則先手必勝。感性證明一下 於是考慮如何計數,可以考慮 binom ...

SDOI2011 染色 題解

題目大意 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 思路 樹剖之後,維護其兩端的顏色 答案和標記即可。include include define n 100001 using...

黑白棋遊戲

黑白棋遊戲 time limit 10000ms memory limit 65536k total submit 9 accepted 5 case time limit 1000ms description 問題描述 黑白棋遊戲的棋盤由4 4方格陣列構成。棋盤的每一方格中放有1枚棋子,共有8枚白...