HNOI2015 落憶楓音

2022-05-13 09:36:37 字數 1019 閱讀 7844

luogu3244

bzoj4011

如果是乙個dag,那麼答案顯然是

\[\prod_^n deg(i)

\]其中\(deg(i)\)是點\(i\)的入度。加上條邊後可能會成環,我們要去掉成環的情況數。考慮乙個環,錯誤的計數只會發生在環上每個點選了自己環上的父親,環外的點隨意。所以對於每個環,多餘的計數是

\[\prod_ deg(i)

\]而環又是乙個\(y\)到\(x\)的路徑加上\((x,y)\)這條邊構成的。所以設\(f[u]\)為從\(u\)出發到\(x\)的路徑(假設其在環上)多餘的貢獻,那麼有

\[f[u] = \sum_ f[v] / deg[u]

\]所以就是乙個簡單的記搜就行了。

#include #include typedef long long ll;

const int n = 100010;

const int m = 200010;

const ll mod = 1e9 + 7;

int hd[n], nxt[m], to[m], cnt;

ll deg[n], f[n], inv[n], n, m;

inline void adde(int x, int y)

int dfs(ll x)

f[x] = f[x] * inv[deg[x]] % mod;

return f[x];

}void calc()

int main()

ll ans = 1, sum = 1;

for (int i = 2; i <= n; ++i)

memset(f, -1, sizeof f); calc(); f[x] = sum * inv[deg[x]] % mod;

ll del = dfs(y);

ans = (ans - del + mod) % mod;

printf("%lld\n", ans);

return 0;

}

HNOI2015 落憶楓音

hnoi2015 落憶楓音 首先 原圖是乙個dag 生成樹即為除了根節點以外每個節點隨便選一條入邊組成的 所以生成樹數量 各個點入度乘積 新加入一條邊 分三種情況 1.如果不成環 那麼可以把它放在原來的dag裡計算 2.如果它的終點為1 那麼忽略不計 3.如果它成環的話 假設其中乙個環大小是size...

HNOI2015 落憶楓音

嘟嘟嘟 這題大意就是有乙個dag,然後新增了一條邊,求上有多少種生成樹。這題想了半天,最後還是寫了暴力。暴力就是 o 2 mn 的那種,還出鍋了幾次 剛開始我不想dfs判斷選出的邊是否構成樹,於是yy了一下,以為只要邊數為 n 1 除了根節點每個點的入度為1且都被訪問過就行了。卻忘了有環的情況 只要...

HNOI2015 落憶楓音

恆逸,你相信靈魂的存在嗎?郭恆逸和姚楓茜漫步在楓音鄉的街道上。望著漫天飛舞的紅楓,楓茜突然問出這樣乙個問題。相信吧。不然我們是什麼,一團肉嗎?要不是有靈魂.我們也不可能再見到你姐姐吧。恆逸給出了乙個略微無厘頭的回答。楓茜聽後笑了笑。那你仔細觀察過楓葉嗎?說罷,楓茜伸手,接住了一片飄落的楓葉。其實每一...