bzoj4031 [HEOI2015]小Z的房间
Description
你突然有了一个大房子,房子里面有一些房间。事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子。在一开始的时候,相邻的格子之间都有墙隔着。
Input
第一行两个数分别表示n和m。
Output
一行一个整数,表示合法的方案数 Mod 10^9
Sample Input
...
...
.*.
Sample Output
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的房间的更多相关文章
- BZOJ4031 [HEOI2015]小Z的房间 【矩阵树定理 + 高斯消元】
题目链接 BZOJ4031 题解 第一眼:这不裸的矩阵树定理么 第二眼:这个模\(10^9\)是什么鬼嘛QAQ 想尝试递归求行列式,发现这是\(O(n!)\)的.. 想上高斯消元,却又处理不了逆元这个 ...
- bzoj4031 [HEOI2015]小Z的房间——矩阵树定理
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4031 矩阵树定理的模板题(第一次的矩阵树定理~): 有点细节,放在注释里了. 代码如下: # ...
- 【bzoj4031】[HEOI2015]小Z的房间 解题报告
[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...
- 【bzoj4031】[HEOI2015]小Z的房间 Matrix-Tree定理+高斯消元
[bzoj4031][HEOI2015]小Z的房间 2015年4月30日3,0302 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的 ...
- 【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)
来两道矩阵树模板: T1:[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形 ...
- bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp
4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 98 Solved: 29[Submit][Status] ...
- [HEOI2015]小Z的房间 && [CQOI2018]社交网络
今天看了一下矩阵树定理,然后学了一下\(O(n ^ 3)\)的方法求行列式. 哦对了,所有的证明我都没看-- 这位大佬讲的好呀: [学习笔记]高斯消元.行列式.Matrix-Tree 矩阵树定理 关于 ...
- 【BZOJ-4031】小z的房间 Matrix-Tree定理 + 高斯消元解行列式
4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 937 Solved: 456[Submit][Statu ...
- 【BZOJ 4031】 4031: [HEOI2015]小Z的房间 (Matrix-Tree Theorem)
4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1089 Solved: 533 Description ...
随机推荐
- ST Lab1 junit test
代码地址: https://github.com/newff/st-lab1 Tasks: Install Junit(4.12), Hamcrest(1.3) with Eclipse Insta ...
- 自学 iOS - 三十天三十个 Swift 项目 第一天
最近公司项目不是很忙,偶然间看到编程语言排行榜,看到swift 已经排到前10了,然OC排名也越来越后了,感觉要上车了,虽然现在项目都是用OC写的,但是swift是一种趋势.在网上看到"自学 ...
- C++STL的简单使用
#include <iostream>#include <vector>#include<deque>#include <list>#include&l ...
- Zookepper(2015.08.16笔记)
2015.08.16zookepper Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务(如同小区里面的供水.电的系统) 它包含一个简单的原 ...
- PyQt QListWidget修改列表项item的行高
百度,谷歌之后都说用setHintSize(self,QCore.QSize(width,height)),然并卵,后来用qss修改就可以了,具体用法如下 # emaillist是我给QListWid ...
- pyqt样式表语法笔记
pyqt样式表语法笔记 pyqt QSS python 样式表 因为软件课设的原因开始学习使用pyqt4,才发现原来它也有样式表,而且语法跟css基本相同,而且一些功能实现起来感觉比js要简单方便得多 ...
- ASP.NET Core:CMD命令行+记事本 创建Console程序和Web Application
今天看了Scott关于ASP.NET Core的介绍视频,发现用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运 ...
- VC++中经常出现的内存泄露和指针问题
要养成良好的编程习惯,每次用new开辟的新空间马上先写好释放语句delete.指针在程序中往往有很多细节问题,比如1.指针作为返回值,某个分支中进行赋值返回,另一个分支却没有值.2.指针作为函数参数传 ...
- css中的inline-block
div { display: inline-block; *display: inline; *zoom: 1; } Basic Support包含值:none | inline | block | ...
- css2.1实现圆角边框
虽然css3的border-radius实现圆角很简单,但是我还是认为css2.1中好多技术还是很值得学习的,我也是后来才知道这就是传说中的滑动门技术.脑洞大开啊 附上demo <!DOCTYP ...