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