BZOJ4031 HEOI2015 小Z的房間

2022-05-09 15:28:15 字數 1607 閱讀 9095

試題描述

你突然有了乙個大房子,房子裡面有一些房間。事實上,你的房子可以看做是乙個包含 \(n \times m\) 個格仔的格狀矩形,每個格仔是乙個房間或者是乙個柱子。在一開始的時候,相鄰的格仔之間都有牆隔著。

你想要打通一些相鄰房間的牆,使得所有房間能夠互相到達。在此過程中,你不能把房子給打穿,或者打通柱子(以及柱子旁邊的牆)。同時,你不希望在房子中有小偷的時候會很難抓,所以你希望任意兩個房間之間都只有一條通路。現在,你希望統計一共有多少種可行的方案。

輸入第一行兩個數分別表示 \(n\) 和 \(m\)。

接下來 \(n\) 行,每行 \(m\) 個字元,每個字元都會是.或者*,其中.代表房間,*代表柱子。

輸出一行乙個整數,表示合法的方案數\(\mathrm\ 10^9\)

輸入示例

3 3

......

.*.

輸出示例
15
資料規模及約定

對於前 \(100\%\) 的資料,\(n,m \le 9\)

題解矩陣樹定理裸題,來練習一下高斯消元。

高斯消元可以輾轉相除,這樣好寫。

注意本題在消元過程中要時時取模,中途可能會爆 long long。

#include #include #include #include #include #include using namespace std;

#define rep(i, s, t) for(int i = (s); i <= (t); i++)

#define dwn(i, s, t) for(int i = (s); i >= (t); i--)

int read()

while(isdigit(c))

return x * f;

}#define maxr 10

#define maxn 100

#define mod 1000000000

#define ll long long

int r, c;

char map[maxr][maxr];

int n, p[maxr][maxr];

int id(int i, int j)

ll a[maxn][maxn];

void elim(ll* a, ll* b, int tar)

void calcdet(ll a[maxn])

ll sum = 1;

rep(i, 1, n) sum = sum * a[i][i] % mod;

printf("%lld\n", (sum * sgn + mod) % mod);

return ;

}int main()

if(j < c && map[i][j+1] == '.') }

n--;

// rep(i, 1, n) rep(j, 1, n) printf("%lld%c", a[i][j], j < n ? ' ' : '\n');

calcdet(a);

return 0;

}

HEOI2015 BZOJ4031 小Z的房間

description 你突然有了乙個大房子,房子裡面有一些房間。事實上,你的房子可以看做是乙個包含n m個格仔的格狀矩形,每個格仔是乙個房間或者是乙個柱子。在一開始的時候,相鄰的格仔之間都有牆隔著。你想要打通一些相鄰房間的牆,使得所有房間能夠互相到達。在此過程中,你不能把房子給打穿,或者打通柱子 ...

HEOI2015 bzoj4031 小z的房間

description 你突然有了乙個大房子,房子裡面有一些房間。事實上,你的房子可以看做是乙個包含n m個格仔的格狀矩形,每個格仔是乙個房間或者是乙個柱子。在一開始的時候,相鄰的格仔之間都有牆隔著。你想要打通一些相鄰房間的牆,使得所有房間能夠互相到達。在此過程中,你不能把房子給打穿,或者打通柱子 ...

bzoj4031 HEOI2015 小Z的房間

你突然有了乙個大房子,房子裡面有一些房間。事實上,你的房子可以看做是乙個包含n m個格仔的格狀矩形,每個格仔是乙個房間或者是乙個柱子。在一開始的時候,相鄰的格仔之間都有牆隔著。你想要打通一些相鄰房間的牆,使得所有房間能夠互相到達。在此過程中,你不能把房子給打穿,或者打通柱子 以及柱子旁邊的牆 同時,...