SHOI2016 黑暗前的幻想鄉

2022-05-02 05:39:07 字數 1077 閱讀 8698

如果沒有建築公司的限制,那麼就是個\(\mathrm\)板子

其實有了也一樣

發現\(n\leq 17\),考慮容斥

每次欽定一些建築公司,計算它們包含的邊的生成樹的方案數

複雜度\(\mathrm(2^nn^3)\)

#include#include#include#include#define rg register

#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)

#define clear(x, y) memset(x, y, sizeof(x))

inline int read()

const int n(20), mod(1e9 + 7);

int n, a[n][n], m[n], popcnt[1 << 17], ans;

int u[n][n * n], v[n][n * n];

int solve(int s)

for(rg int i = 1; i <= n; i++)

for(rg int j = 1; j <= n; j++)

a[i][j] = (a[i][j] + mod) % mod;

int ans = 1;

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

ans = 1ll * ans * a[i][i] % mod;

} return ans;

}int main()

for(rg int i = 0; i < 1 << (n - 1); i++)

popcnt[i] = popcnt[i >> 1] + (i & 1);

for(rg int i = 0; i < 1 << (n - 1); i++)

ans = (ans + (((n - 1 - popcnt[i]) & 1) ?

mod - solve(i) : solve(i))) % mod;

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

return 0;

}

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 黑暗前的幻想鄉

嘟嘟嘟 這題昨天看覺得沒有思路,今天看了一眼覺得就是個水題。首先如果不考慮每乙個人只能選一條路的話,那就是求一張無向圖 有重邊,有自環 的生成樹個數。這個直接用矩陣樹定理 高斯消元求解行列式即可解決。現在有了限制,怎麼辦?容斥!其實和 zjoi2016 小星星這道題有點像。想一下,如果乙個公司修了兩...