題目 BZOJ 2560 串珠子

2021-09-26 15:36:18 字數 1973 閱讀 9152

題目大意

有n

nn個結點,編號1

11到n

nn。可以在當中連邊,點i,j

i,ji,

j之間可以連ci,

jc_

ci,j

​種顏色的邊,且每對點之間最多連一條邊。求使得整個圖連通的連邊方案數(邊的顏色不同算作不同方案)。答案模1000000007

1000000007

100000

0007。8⩽

n⩽

168\leqslant n\leqslant 16

8⩽n⩽16

,n ∈z

n\in z

n∈z。

思路設f[s

]f[s]

f[s]

表示將集合s

ss中的點連邊,使得這些點連通的方案數。容易想到把集合s

ss分成兩個小集合s1,

s2

s_1,s_2

s1​,s2

​,用兩個小的狀態更新當前狀態。然而這樣有幾個問題:

兩個小集合內的點不一定是連通的。

同一種方案可能有多種劃分的方式,方案會算重。

狀態轉移需要在這兩個小集合之間連邊,連邊的方案數很難處理。

正難則反,設g[s

]g[s]

g[s]

表示將集合s

ss中的點連邊,使得這些點不連通的方案數,h[s

]h[s]

h[s]

表示任意連邊的方案數,則有f[s

]=h[

s]−g

[s

]f[s]=h[s]-g[s]

f[s]=h

[s]−

g[s]

。由於每條邊都有ci,

j+

1c_+1

ci,j​+

1種選擇(連ci,

jc_

ci,j

​種顏色的邊以及不連邊),可以得到h[s

]h[s]

h[s]

的表示式:

h [s

]=∏i

,j∈s

(c[i

][j]

+1

)h[s]=\prod_(c[i][j]+1)

h[s]=i

,j∈s

∏​(c

[i][

j]+1

)下面要求g[s

]g[s]

g[s]

,容易想到把集合s

ss分成兩個小集合s1,

s2

s_1,s_2

s1​,s2

​,用兩個小的狀態更新當前狀態。然而這樣有幾個問題:

兩個小集合內的點不一定是不連通的。

同一種方案可能有多種劃分的方式,方案會算重。

這個時候就不能正難則反了,要敢於直面慘淡的人生。

既然s

ss中的點不連通,那麼一定可以從其中選出乙個連通的部分出來(設為s

1s_1

s1​),而另一部分連不連通不重要,因為這兩部分中間沒有連邊,整個圖一定是不連通的。可以初步寫出遞推式:

g [s

]=∑s

1∪s2

=sf[

s1]⋅

h[s2

]g[s]=\sum_f[s_1]\cdot h[s_2]

g[s]=s

1​∪s

2​=s

∑​f[

s1​]

⋅h[s

2​]但是方案數依然會算重,因為同一種方案中有多個連通塊可以當做s

1s_1

s1​。解決方法很簡單,在集合s

ss中任選乙個點k

kk,列舉s

1s_1

s1​的時候保證k∈s

1k\in s_1

k∈s1

​,就不會多解;s

1s_1

s1​的大小是任意的,所以也不會漏解。

BZOJ2560 狀態壓縮 容斥原理

3hours orz orz orz.bzoj2560 非許可權 time limit 10 sec memory limit 128 mb submit 654 solved 431 submit status discuss 銘銘有n個十分漂亮的珠子和若干根顏色不同的繩子。現在銘銘想用繩子把所有...

bzoj 題目選做

1.輪狀病毒 題目是很沒意思的 列出狀態 顯然無法遞推 我簡單推了一下加動態加點的狀態 嗯發現規律沒有那麼簡單 打表 也不太能發現吧 正解顯然是 矩陣樹定理啊 然後這題咕了 以後再複習矩陣樹定理的時候再證明這個結論吧 暫時當做打表做的。f n f n 3 f 2 然後高精加和高精減即可。由於都是高精...

題目 BZOJ 4242 水壺

題目大意 某市是乙個被分成h w h times w h w塊區域的長方形,每個區域都是建築物 原野 牆壁之一。建築物的區域有p pp個,編號為1 p 1 dots p 1 p。只有建築物和原野能夠進入,而且每次只能走到相鄰的區域中,且不能移動到市外。現在需要在各個建築物之間往返。在原野上每走過乙個...