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 ...
随机推荐
- C++ IO学习
关于IO,主要有这么三种类型:标准输入输出,文件输入输出,字符串流.后面两种都是继承自第一种标准输入输出的.他们分别对应的头文件是: 标准输入输出:#include <iostream> ...
- Exchange Server 2007的即将生命周期,您的计划是?
多数人做微软技术,Exchange Server 几乎所有 Microsoft 产品,都具有产品支持生命周期,原厂提供的新增功能. 错误修复.安全修补程序等.产品生命周期通常持续时间 10 年,超过期 ...
- PHP的简单易懂文件管理,可实现基本功能
我们利用的是嵌入PHP代码和ajax结合的方式,首相想到的是利用遍历文件的方式找出分件下的目录和文件,并且找到它们的路径,使用 dirname取上级目录, basename从完整路径中取文件名,其中最 ...
- 浅谈!SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND的区别
今天的工作学习之路是一个数据库的小知识,当时没有区分出所以然,特此记录分享一下子. 众所周知,数据库的表都是单独存在的,但是当我们进行联合查询(多表查询)时,我们获得数据库返回的值时就好像在一张表里一 ...
- [译]Selenium Python文档:七、WebDriver API接口
由于API文档格式不太适合cnblog博客,暂且翻译一部分,且暂未校对 注意:这不是官方文档,官方 API文档在这里. 本章包含Selenium WebDriver的所有接口 推荐import风格 本 ...
- 谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画!
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- java学习笔记 --- StringBuffer类
1.定义:字符串缓冲区,即它是一个容器,容器中可以装很多字符.并且能够对其中的字符进行各种操作. StringBuffer的特点: 1.是一个字符串缓冲区,其实就是一个容器. 2.长度是可变,任意类型 ...
- flex中日期的格式化
今天我做的项目中需要把时间给拆分了,形式为:yyyy-MM-DD HH mm, 下面是我的代码实现: <?xml version="1.0" encoding="u ...
- Chrome 33+ 自建 扩展 实现 custom.css
http://bbs.kafan.cn/thread-1674386-1-2.html
- Linux下的文件描述符
文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的文件是0,第二个是1,依此类推.Unix 操作系统通常给每个进程能打开的文件数量强加一个限制.更甚的是,unix ...