小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...