HAOI2018 反色遊戲

2021-09-29 06:35:25 字數 1786 閱讀 9734

小c和小g經常在一起研究搏弈論問題,有一天他們想到了這樣乙個遊戲.

有乙個 n

nn 個點 m

mm 條邊的無向圖,初始時每個節點有乙個顏色,要麼是黑色,要麼是白色.現在他們對於每條邊做出一次抉擇:要麼將這條邊連線的兩個節點都反色(黑變白,白變黑),要麼不作處理.他們想把所有節點都變為白色,他們想知道在 2

m2^m

2m種決策中,有多少種方案能達成這個目標.

小g認為這個問題太水了,於是他還想知道,對於第 i

ii 個點,在刪去這個點及與它相連的邊後,新的答案是多少.

由於答案可能很大,你只需要輸出答案對 109

+7

10^9 + 7

109+

7 取模後的結果.

1 ≤t

≤5,1

≤n,m

≤105

,1≤u

,v≤n

1 \le t \le 5, 1 \le n, m \le 10^5, 1 \le u, v \le n

1≤t≤5,

1≤n,

m≤10

5,1≤

u,v≤

n考慮連通塊內如果有奇數個黑點,則答案為 000

考慮只有乙個連通塊的情況,如果這個連通塊是棵樹,那麼它只有一種染色方案。所以考慮建出這個連通塊的 dfs

dfsdf

s 樹,那每條返祖邊可以對答案有 2

22 的貢獻,即把這條返祖邊連線的兩個端點間的樹邊以及該返祖邊一起染色,所以乙個連通塊的答案是 2m−

n+12^

2m−n+1

,自然多個連通塊的答案就是 2m−

n+c2^

2m−n+c

,其中 c

cc 為連通塊個數

考慮刪掉乙個點,那就分割點或者非割點討論一下,如果是割點,要注意連通塊個數會增加,如果是單獨乙個點,則連通塊個數會 −1-1

−1,然後再計算一下有奇數個黑點的連通塊個數有多少即可

#include

using

namespace std;

const

int n=

2e5+

5,p=

1e9+7;

char ch;

int t,n,m,hd[n]

,v[n]

,nx[n]

,t,is[n]

,sz[n]

;int a[n]

,dp[n]

,s[n]

,pw[n]

,a,c,r,g[n]

,sn[n]

;void

add(

int u,

int v)

void

dfs(

int x,

int fr)

}void

work

(int x,

int fr)

else

for(

int i=hd[x]

;i;i=nx[i])if

(dp[v[i]

]==dp[x]+1

)work

(v[i]

,x);

}void

work()

else r=i,

work

(i,0);

}printf

(" %d"

,g[i]);

}putchar

('\n');

}int

main()

題解 HAOI2018 反色遊戲

題目傳送門 給出乙個 n 個點 m 條無向邊的圖,每個點都有乙個 in 0,1 的權值,每次可以選擇一條邊,然後將該邊相連兩點權值異或上 1 問有多少種選擇方法使得每個點的權值都變為 0 每條邊只能選擇一次 但是這個問題太簡單了,所以你要求刪掉每個點以及它連出的邊之後的答案。有 t 組資料,t le...

HAOI2018 簡要題解

以前做過的 haoi2018 染色 haoi2018 蘋果樹暫時不更 haoi2018 字串覆蓋 已經棄療了。總體難度 medium 偏 easy,但是 luogu4495 haoi2018 奇怪的揹包 想不到是真的腦抽。可以在 找到。小 c 和小 g 經常在一起研究搏弈論問題,有一天他們想到了這樣...

HAOI 2018 染色(容斥 NTT)

設 f k 為強制選擇 k 個顏色出現 s 種,其餘任取的方案數。則有 f k m k 不難看出,這個方案可能包括了超過 k 種顏色,也有重複的方案,所以恰有 k 個顏色出現 s 種的方案 ans k 滿足 ans k sum 1 f i 最終化簡得到 ans k sum i f i cdot ov...