luogu SHOI2016 黑暗前的幻想鄉

2021-09-19 04:52:56 字數 1386 閱讀 2570

heh

e...

hehe...

hehe..

.有n

nn個城市,(n−

1)

(n-1)

(n−1

)支工程隊,每一支工程隊可以修築一定的道路。現在要修建(n−

1)

(n-1)

(n−1

)條道路連線這些城市,求方案數。

考慮容斥去重(對於修邊集合一樣的需要去重)。

a ns

=選n個

工程隊的

貢獻−(

n−1)

個工程隊

的貢獻+

...1

個工程隊

的貢

獻ans=選n個工程隊的貢獻-(n-1)個工程隊的貢獻+...1個工程隊的貢獻

ans=選n

個工程隊

的貢獻−

(n−1

)個工程

隊的貢獻

+...

1個工程

隊的貢獻

(貢獻指當前生成樹的個數)。

裝壓列舉工程隊合作的所有情況,並連線此時的道路,然後跑基爾霍夫矩陣&矩陣樹定理。

#include

#include

#include

#define ll long long

#define mod ((ll)(1e9)+7)

using

namespace std;

ll d[

110]

[110

],a[

110]

[110

],k[

110]

[110];

int n;

struct node a[

110]

;ll dg

(ll x,ll k)

ll inv

(ll x,ll y)

intget

(int x)

return op;

}void

calc

(int x,

int y)

ll matrix_tree

(int tot)

ans=

(ans*k[i]

[i]%mod+mod)

%mod;

}return ans;

}int

main()

ll ans=0;

for(

int i=

1;i<(1

<<

(n-1))

;i++

)printf

("%lld"

,ans)

;}

SHOI2016 黑暗前的幻想鄉

點此看題 好久沒有做過這麼版的題了 首先你要知道指數級容斥,也就是我們列舉乙個公司集合,表示我們只在這些公司中選邊,那麼我們就用全部公司 少乙個公司 少兩個公司 來計算就行。知道邊算生成樹,不就是矩陣樹定理麼?include include include include using namespa...

SHOI2016 黑暗前的幻想鄉

幻想鄉是個什麼東西?逃 就是設 dp i 表示至多i個公司修建道路,那麼我們有 ans dp n 1 dp n 2 dp n 3 balabala 就是那個容斥公式嘛qwqwq 然後每次都跑一次矩陣樹定理qwqwq 但是這樣的時間複雜度是 o n 32 所以說。跑的。2s。很勉強qwqwq 如下 i...

SHOI2016 黑暗前的幻想鄉

如果沒有建築公司的限制,那麼就是個 mathrm 板子 其實有了也一樣 發現 n leq 17 考慮容斥 每次欽定一些建築公司,計算它們包含的邊的生成樹的方案數 複雜度 mathrm 2 nn 3 include include include include define rg register ...