【BZOJ-4031】小z的房间 Matrix-Tree定理 + 高斯消元解行列式
4031: [HEOI2015]小Z的房间
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 937 Solved: 456
[Submit][Status][Discuss]
Description
你突然有了一个大房子,房子里面有一些房间。事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子。在一开始的时候,相邻的格子之间都有墙隔着。
Input
第一行两个数分别表示n和m。
Output
一行一个整数,表示合法的方案数 Mod 10^9
Sample Input
...
...
.*.
Sample Output
HINT
对于前100%的数据,n,m<=9
Source
Solution
矩阵树定理模板题
自己脑残WA了两次...第一次是因为Gauss消元求行列式时把最后一行一起搞了...和直接输出0没区别...
第二次是因为手残打反NM...
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define LL long long
#define P 1000000000
char mp[50][50];
int N,M,dx[4]={-1,0,1,0},dy[4]={0,1,0,-1},A[100][100],D[100][100],id[10][10],ID;
LL G[100][100]; inline bool check(int x,int y) {return x>=1&&x<=N&&y>=1&&y<=M&&mp[x][y]!='*';}
inline void InsertEdge(int u,int v) {D[v][v]++; A[u][v]=1;}
inline LL Gauss()
{
int f=1; LL ans=1; ID--; for (int i=1; i<=ID; i++)
for (int j=1; j<=ID; j++)
G[i][j]=(G[i][j]+P)%P; // for (int i=1; i<=ID; i++,puts(""))
// for (int j=1; j<=ID; j++) printf("%d ",G[i][j]); for (int i=1; i<=ID; i++) {
for (int j=i+1; j<=ID; j++) {
LL x=G[i][i],y=G[j][i];
while (y) {
LL t=x/y; x%=y; swap(x,y);
for (int k=i; k<=ID; k++)
G[i][k]=(G[i][k]-t*G[j][k]%P+P)%P;
for (int k=i; k<=ID; k++)
swap(G[i][k],G[j][k]);
f=-f;
}
} if (!G[i][i]) return 0;
ans=ans*G[i][i]%P;
} if (f==-1) return (P-ans)%P;
return ans;
} int main()
{
// freopen("room.in","r",stdin);
// freopen("room.out","w",stdout); scanf("%d%d",&N,&M);
for (int i=1; i<=N; i++) scanf("%s",mp[i]+1); for (int i=1; i<=N; i++)
for (int j=1; j<=M; j++) if (mp[i][j]!='*') id[i][j]=++ID; for (int i=1; i<=N; i++)
for (int j=1; j<=M; j++)
if (mp[i][j]!='*')
for (int d=0; d<4; d++) {
int tx=i+dx[d],ty=j+dy[d];
if (check(tx,ty)) InsertEdge(id[i][j],id[tx][ty]);
} for (int i=1; i<=ID; i++)
for (int j=1; j<=ID; j++) G[i][j]=D[i][j]-A[i][j]; printf("%lld\n",Gauss()); return 0;
}
【BZOJ-4031】小z的房间 Matrix-Tree定理 + 高斯消元解行列式的更多相关文章
- bzoj 4031: 小Z的房间 矩阵树定理
bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...
- BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)
题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...
- [BZOJ 4031] 小Z的房间
Link: BZOJ 4031 传送门 Solution: 矩阵树定理的模板题 看完下面两篇文章就会啦: 周冬论文:https://wenku.baidu.com/view/872eb02de2bd9 ...
- BZOJ 4031: [HEOI2015]小Z的房间(Matrix Tree)
传送门 解题思路 矩阵树定理模板题.矩阵树定理是求图中最小生成树个数,做法是首先求出基尔霍夫矩阵,就是度数矩阵\(-\)邻接矩阵.然后再求出这个矩阵的行列式,行列式的求法就是任意去掉一行一列,然后高斯 ...
- 【bzoj4031】[HEOI2015]小Z的房间 Matrix-Tree定理+高斯消元
[bzoj4031][HEOI2015]小Z的房间 2015年4月30日3,0302 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的 ...
- [HEOI2015]小Z的房间(矩阵树定理学习笔记)
题目描述 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. 你想要打通一 ...
- 【BZOJ 3143】【Hnoi2013】游走 期望+高斯消元
如果纯模拟,就会死循环,而随着循环每个点的期望会逼近一个值,高斯消元就通过列方正组求出这个值. #include<cstdio> #include<cctype> #inclu ...
- BZOJ 2844 albus就是要第一个出场(高斯消元)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2844 题意: 给出一个长度为n的正整数数列A.每次选出A的一个子集进行抑或(空集抑或值为 ...
- BZOJ 4031: [HEOI2015]小Z的房间 [矩阵树定理 行列式取模]
http://www.lydsy.com/JudgeOnline/problem.php?id=4031 裸题........ 问题在于模数是$10^9$ 我们发现消元的目的是让一个地方为0 辗转相除 ...
随机推荐
- Python 算法实现
# [程序1] # 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? l=[1,2,3,4] count = 0 for i in range(len(l)): fo ...
- 【BZOJ】1095: [ZJOI2007]Hide 捉迷藏 括号序列+线段树
[题目]BZOJ 1095 [题意]给定n个黑白点的树,初始全为黑点,Q次操作翻转一个点的颜色,或询问最远的两个黑点的距离,\(n \leq 10^5,Q \leq 5*10^5\). [算法]括号序 ...
- bug处理
当提示405 method not allowed 时候,路由可能有问题,看看路由是get/post 是否合格
- 日常训练赛 Problem C – Complete Naebbirac’s sequence
比赛链接https://vjudge.net/contest/256988#status/17111202012/C/0/ 大意:三个操作,使得输入的数中,从1-n,每一个数出现的次数相同. wa代码 ...
- Linux Timer定时器【转】
转自:https://www.jianshu.com/p/66b3c75cae81 timerfd为Linux为用户程序提供的定时器接口,该接口基于文件描述符,通过文件描述符的可读事件进行超时通知,且 ...
- springcloud搭建服务注册中心与服务发现
1.创建服务注册中心 创建一个普通的Spring Boot工程 首先我们需要创建一个普通的Spring Boot工程,命名为eureka-server,普通到什么程度呢?就是一个starter都不需要 ...
- Qt 程序等待多长时间执行Sleep
#include <QTime> void MainWindow::Sleep(unsigned int msec) { QTime reachTime=QTime::currentTim ...
- centos6.5环境通过shell脚本备份php的web及mysql数据库并做远程备份容灾
centos6.5环境通过shell脚本备份php的web及mysql数据库并做远程备份容灾 系统:centos6.5 1.创建脚本目录 mkdir -p /usr/local/sh/ 创建备份web ...
- Angularjs里面跨作用域的实战!
好久没有来写博客了,最近一直在用Google的AngularJS,后面我自己简称AngularJS就叫AJ吧! 学习AngularJS一路也是深坑颇多啊--!就不多说了,不过还是建议大家有时间去学下下 ...
- (转载)mysql:设置mysql的远程访问
1.登陆Mysqlmysql -u root -p2.允许任何IP访问,其中密码为admingrant all privileges on *.* to root@"%" iden ...