国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

BZOJ 4031: [HEOI2015]小Z的房間 Matrix-Tree定理+輾轉(zhuǎn)相除法求行列式的值(高斯消元)

2019-11-06 07:18:25
字體:
供稿:網(wǎng)友

Description

你突然有了一個(gè)大房子,房子里面有一些房間。事實(shí)上,你的房子可以看做是一個(gè)包含n*m個(gè)格子的格狀矩形,每個(gè)格子是一個(gè)房間或者是一個(gè)柱子。在一開始的時(shí)候,相鄰的格子之間都有墻隔著。 你想要打通一些相鄰房間的墻,使得所有房間能夠互相到達(dá)。在此過程中,你不能把房子給打穿,或者打通柱子(以及柱子旁邊的墻)。同時(shí),你不希望在房子中有小偷的時(shí)候會(huì)很難抓,所以你希望任意兩個(gè)房間之間都只有一條通路。現(xiàn)在,你希望統(tǒng)計(jì)一共有多少種可行的方案。 Input

第一行兩個(gè)數(shù)分別表示n和m。 接下來n行,每行m個(gè)字符,每個(gè)字符都會(huì)是’.’或者’’,其中’.’代表房間,’’代表柱子。 Output

一行一個(gè)整數(shù),表示合法的方案數(shù) Mod 10^9 Sample Input 3 3

.*.

Sample Output 15 HINT

對(duì)于前100%的數(shù)據(jù),n,m<=9

解法:Matrix-Tree就是生成樹計(jì)數(shù)問題的計(jì)算方法,不知道可以百度,推導(dǎo)我忘得差不多了,隊(duì)友說記得結(jié)論就可以了,那好吧。。。。所以這道題就轉(zhuǎn)化了一個(gè)行列式求值的問題,但是我們不能直接高斯消元,這是整數(shù),顯然精度是會(huì)boom的對(duì)吧。那么怎么做呢?我也不會(huì)啊,看了hzwer的一種利用輾轉(zhuǎn)相除法來計(jì)算的姿勢,很棒棒啊。大概是這樣的,高斯消元時(shí)進(jìn)行初等變換,正常高斯消元把某行乘以某個(gè)數(shù)字加到另一行上,使得目標(biāo)行某個(gè)位置為0,算出對(duì)應(yīng)位置比例一次變換。在整數(shù)意義下,設(shè)對(duì)應(yīng)位置數(shù)值為b,a使得a為0,則使a所在行+b所在行*a/b,(b,a)->(b,a mod b)。交換2行,做類似相同操作,直到b或a為0停止。

//BZOJ 4031#include <bits/stdc++.h>using namespace std;const int mod = 1e9;int dir[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};long long a[110][110];int n, m, idx, vis[110][100];char s[110];long long det(int n){ for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ a[i][j] = (a[i][j] + mod) % mod; } } long long ans = 1, f = 1; for(int i = 1; i <= n; i++){ for(int j = i + 1; j <= n; j++){ long long A = a[i][i], B = a[j][i]; while(B){ long long t = A/B; A %= B; swap(A, B); for(int k = i; k <= n; k++) a[i][k] = (a[i][k] - t*a[j][k]%mod + mod) % mod; for(int k = i; k <= n; k++) swap(a[i][k], a[j][k]); f = -f; } } if(!a[i][i]) return 0; ans = ans * a[i][i] % mod; } if(f == -1) ans = (mod - ans) % mod; return ans;}int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++){ scanf("%s", s+1); for(int j = 1; j <= m; j++){ if(s[j] == '.') vis[i][j] = ++idx; } } for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ if(vis[i][j]){ for(int k = 0; k < 4; k++){ int x = i + dir[k][0], y = j + dir[k][1]; if(x <= 0 || x > n || y <= 0 || y > m || !vis[x][y]) continue; a[vis[i][j]][vis[i][j]]++; a[vis[i][j]][vis[x][y]]--; } } } }
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 昌宁县| 左贡县| 永德县| 漾濞| 甘孜| 盈江县| 兰州市| 乐清市| 通化县| 汝州市| 莱州市| 龙南县| 内乡县| 奉贤区| 剑阁县| 安新县| 射洪县| 房产| 白水县| 静安区| 广平县| 徐水县| 家居| 上蔡县| 临沂市| 容城县| 长寿区| 和硕县| 桐城市| 襄垣县| 怀安县| 吉安市| 尉犁县| 修武县| 富锦市| 东至县| 柳州市| 宁波市| 蒙阴县| 阜宁县| 辽阳县|