Description

你突然有了一个大房子,房子里面有一些房间。事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子。在一开始的时候,相邻的格子之间都有墙隔着。

你想要打通一些相邻房间的墙,使得所有房间能够互相到达。在此过程中,你不能把房子给打穿,或者打通柱子(以及柱子旁边的墙)。同时,你不希望在房子中有小偷的时候会很难抓,所以你希望任意两个房间之间都只有一条通路。现在,你希望统计一共有多少种可行的方案。

Input

第一行两个数分别表示n和m。

接下来n行,每行m个字符,每个字符都会是’.’或者’*’,其中’.’代表房间,’*’代表柱子。

Output

一行一个整数,表示合法的方案数 Mod 10^9

Sample Input

3 3
...
...
.*.

Sample Output

15

HINT

对于前100%的数据,n,m<=9

正解:矩阵树定理+高斯消元。

$Matrix-Tree$定理

1、$G$的度数矩阵$\({D_G}\)$是一个$n*n$的矩阵,并且满足:当$i≠j$时,$\({D_{i,j}}\)=0$;当$i=j$时,$\({D_{i,j}}\)$等于$\({V_{i}}\)$的度数。
2、$G$的邻接矩阵$\({A_{G}}\)$也是一个$n*n$的矩阵,并且满足:如果$\({V_{i}}\)$、$\({V_{j}}\)$之间有边直接相连,则$\({A_{i,j}}\)=1$,否则为$0$。
定义$G$的$Kirchhoff$矩阵$\(C_G\)$为$\(C_G=D_G-A_G\)$
$Matrix-Tree$定理:$G$的所有不同的生成树的个数等于其$Kirchhoff$矩阵$\(C_G\)$任何一个$n-1$阶主子式(去掉第$r$行第$r$列的新矩阵)的行列式的绝对值。

这题有一个麻烦的地方在于:模数不是质数。所以我们不能直接求逆元。但是我们可以用欧几里得定理,直接辗转相除就行了。

 //It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define rhl (1000000000)
#define inf (1<<30)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; ll a[][],d[][],g[][],c[][],n,m,cnt,ans;
char s[][]; il void insert(RG ll x,RG ll y){ g[x][y]=,d[x][x]++; return; } il void gauss(){
RG ll f=;
for (RG ll i=;i<cnt;++i){
for (RG ll j=i+;j<cnt;++j){
RG ll x=a[i][i],y=a[j][i];
while (y){
RG ll t=x/y; x%=y; swap(x,y);
for (RG ll k=i;k<cnt;++k){
a[i][k]=(a[i][k]-t*a[j][k]%rhl+rhl)%rhl;
swap(a[i][k],a[j][k]);
}
f=-f;
}
}
if (!a[i][i]){ ans=; return; }
ans=ans*a[i][i]%rhl;
}
if (f==-) ans=(rhl-ans)%rhl; return;
} il void work(){
cin>>n>>m,ans=;
for (RG ll i=;i<=n;++i){
scanf("%s",s[i]+);
for (RG ll j=;j<=m;++j)
if (s[i][j]=='.') c[i][j]=++cnt;
}
for (RG ll i=;i<=n;++i)
for (RG ll j=;j<=m;++j){
if (s[i][j]=='*') continue;
if (i-> && s[i-][j]=='.') insert(c[i][j],c[i-][j]);
if (i+<=n && s[i+][j]=='.') insert(c[i][j],c[i+][j]);
if (j-> && s[i][j-]=='.') insert(c[i][j],c[i][j-]);
if (j+<=m && s[i][j+]=='.') insert(c[i][j],c[i][j+]);
}
for (RG ll i=;i<=cnt;++i)
for (RG ll j=;j<=cnt;++j) a[i][j]=(d[i][j]-g[i][j]+rhl)%rhl;
gauss(); printf("%lld",ans); return;
} int main(){
File("room");
work();
return ;
}

bzoj4031 [HEOI2015]小Z的房间的更多相关文章

  1. BZOJ4031 [HEOI2015]小Z的房间 【矩阵树定理 + 高斯消元】

    题目链接 BZOJ4031 题解 第一眼:这不裸的矩阵树定理么 第二眼:这个模\(10^9\)是什么鬼嘛QAQ 想尝试递归求行列式,发现这是\(O(n!)\)的.. 想上高斯消元,却又处理不了逆元这个 ...

  2. bzoj4031 [HEOI2015]小Z的房间——矩阵树定理

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4031 矩阵树定理的模板题(第一次的矩阵树定理~): 有点细节,放在注释里了. 代码如下: # ...

  3. 【bzoj4031】[HEOI2015]小Z的房间 解题报告

    [bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...

  4. 【bzoj4031】[HEOI2015]小Z的房间 Matrix-Tree定理+高斯消元

    [bzoj4031][HEOI2015]小Z的房间 2015年4月30日3,0302 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的 ...

  5. 【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)

    来两道矩阵树模板: T1:[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形 ...

  6. bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 98  Solved: 29[Submit][Status] ...

  7. [HEOI2015]小Z的房间 && [CQOI2018]社交网络

    今天看了一下矩阵树定理,然后学了一下\(O(n ^ 3)\)的方法求行列式. 哦对了,所有的证明我都没看-- 这位大佬讲的好呀: [学习笔记]高斯消元.行列式.Matrix-Tree 矩阵树定理 关于 ...

  8. 【BZOJ-4031】小z的房间 Matrix-Tree定理 + 高斯消元解行列式

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 937  Solved: 456[Submit][Statu ...

  9. 【BZOJ 4031】 4031: [HEOI2015]小Z的房间 (Matrix-Tree Theorem)

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1089  Solved: 533 Description ...

随机推荐

  1. android开发之多线程实现方法概述

    一.单线程模型 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件, ...

  2. 用递归的方式处理数组 && 把递归方法方法定义到数组的原型上 (这是一次脑洞大开的神奇尝试)

    在 javascript 里,如果我们想用一个函数处理数组 (Array) 中的每个元素,那我们有很多种选择,最简单的当然就是用自带的 forEach 函数(低版本也可以使用 lodash 中的 fo ...

  3. ZJOI2017 Day3 滚粗记

    私のZJOI Day3 2017-3-21 07:52:53 今天,考了人生当中的第一次省选(虽然只是普及组三等奖但仍然有幸能体会一下).据胡老师说,这就是来体验一下被大神虐--真的是这样,听课听不懂 ...

  4. 集合框架(HashSet存储自定义对象保证元素唯一性)

    HashSet如何保证元素唯一性的原理 1.HashSet原理 a. 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降 ...

  5. Tcl与Design Compiler (四)——DC启动环境的设置

    本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 主要内容有: ·启动环 ...

  6. canvas 3D雪花效果

    <!DOCTYPE html> <html style="height: 100%;"> <head> <meta charset=&qu ...

  7. mysq常用l性能分析方法

    orzdba查看读写./orzdba.pl --mysql -S /data/mysql30001/mysql.sock 语句查看读写命令数量,以及数据库TPS,传输的大小 查看processlist ...

  8. Linux简介与厂商版本下

    2. Linux的厂商版本 在Linux内核基础上,我们还有许多厂商版本.即使有了内核和GNU软件,Linux的安装和编译并不是简单的工作,Linux厂商就是瞄准了这个市场.这些厂商会在Linux内核 ...

  9. UNION ALL合表查询

    有时候需要连表查询数据,可以使用union all来做合表. 语法: SELECT column_name FROM table1UNION ALLSELECT column_name FROM ta ...

  10. es suggest did you mean资料

    term suggester 功能介绍 term suggester 根据提供的文档提供搜索关键词的建议,也就是关键词自动纠错.该链接介绍如何使用 term suggester 语法.term sug ...