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 ...
随机推荐
- JVM运行和类加载过程
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) (该知识点引用 http://www.cnblogs.com/dingyingsi/p/3760730.h ...
- tomcat常见错误
在这里总结下之前遇到的关于Tomcat的错误: 第一个: web.xml 文件配置的 url-pattern 出现了与其他工程中重名的访问url 在console台可以看到这行报错的代码: Cause ...
- Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)
(一)Eclipse中的快捷键: ctrl+shift+f自动整理选择的java代码 alt+/ 生成无参构造器或者提升信息 alt+shift+s+o 生成带参构造 ctrl+shift+o快速导 ...
- Android -- 自定义ViewGroup+贝塞尔+属性动画实现仿QQ点赞效果
1,昨天我们写了篇简单的贝塞尔曲线的应用,今天和大家一起写一个QQ名片上常用的给别人点赞的效果,实现效果图如下: 红心的图片比较丑,见谅见谅(哈哈哈哈哈哈).... 2,实现的思路和原理 从上面的效果 ...
- Visual Studio Code 使用Chrome Debug 代码
一.添加插件 Debugger for Chrome,点击安装,安装完成之后,启动 二.配置启动参数 1.按 F5,出现界面如图,选择 Chrome 2.然后会打开配置文件 launch.json 3 ...
- 性能测试培训:sql server性能测试分析局部变量的性能影响
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loadrunner的培训中,为了提高学员性能优化的经验,加入了 ...
- MVC 5 + EF6 完整教程15 -- 使用DI进行解耦
如果大家研究一些开源项目,会发现无处不在的DI(Dependency Injection依赖注入). 本篇文章将会详细讲述如何在MVC中使用Ninject实现DI 文章提纲 场景描述 & 问题 ...
- 5w2h分析法则
5W2H分析法 5W2H分析法又叫七何分析法,是二战中美国陆军兵器修理部首创.简单.方便,易于理解.使用,富有启发意义,广泛用于企业管理和技术活动,对于决策和执行性的活动措施也非常有帮助,也有助于弥补 ...
- boostrap---btn
bootstrap入门教程,按钮.按钮风格.下拉菜单等 本教程演示: bootstrap框架的按钮.按钮大小.按钮风格.按钮组.下拉菜单制作等. 使用的版本:Bootstrap v2.3.2 . 下面 ...
- Service详解
/** * 后台执行的定时任务 */ public class LongRunningService extends Service { @Override public IBinder onBind ...