题目描述

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

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

输入

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

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

输出

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

样例输入

3 3
...
...
.*.

样例输出

15


题解

矩阵树定理

题目显然是求连通图的生成树数目,因此直接使用矩阵树定理即可。

矩阵树定理:连通图的生成树数目等于 |度数矩阵-邻接矩阵| 的矩阵行列式的任意一个n-1阶余子式的值,

但是本题由于模数不为质数,因此不能直接在模意义下消元,需要使用辗转相除法。具体详见代码。

跑得还是挺快的。

#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod = 1000000000;
int dx[] = {1 , 0 , -1 , 0} , dy[] = {0 , 1 , 0 , -1} , pos[15][15] , tot;
ll a[110][110];
char str[15];
int main()
{
int n , m , i , j , k , d = 0 , t;
ll ans = 1;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%s" , str + 1);
for(j = 1 ; j <= m ; j ++ )
if(str[j] == '.')
pos[i][j] = ++tot;
}
for(i = 1 ; i <= n ; i ++ )
for(j = 1 ; j <= m ; j ++ )
if(pos[i][j])
for(k = 0 ; k < 4 ; k ++ )
if(pos[i + dx[k]][j + dy[k]])
a[pos[i][j]][pos[i][j]] ++ , a[pos[i][j]][pos[i + dx[k]][j + dy[k]]] -- ;
for(i = 1 ; i < tot ; i ++ )
{
for(j = i ; j < tot ; j ++ )
if(a[j][i])
break;
if(j == tot) continue;
if(j != i)
{
for(k = i ; k < tot ; k ++ ) swap(a[i][k] , a[j][k]);
d ^= 1;
}
for(j = i + 1 ; j < tot ; j ++ )
{
while(a[j][i])
{
t = a[j][i] / a[i][i];
for(k = i ; k < tot ; k ++ ) a[j][k] = (a[j][k] - a[i][k] * t % mod + mod) % mod;
if(!a[j][i]) break;
for(k = i ; k < tot ; k ++ ) swap(a[i][k] , a[j][k]);
d ^= 1;
}
}
}
for(i = 1 ; i < tot ; i ++ ) ans = ans * a[i][i] % mod;
if(d) ans = (mod - ans) % mod;
printf("%lld\n" , ans);
return 0;
}

【bzoj4031】[HEOI2015]小Z的房间 矩阵树定理的更多相关文章

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

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

  2. [HEOI2015]小Z的房间(矩阵树定理学习笔记)

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

  3. BZOJ 4031: [HEOI2015]小Z的房间 [矩阵树定理 行列式取模]

    http://www.lydsy.com/JudgeOnline/problem.php?id=4031 裸题........ 问题在于模数是$10^9$ 我们发现消元的目的是让一个地方为0 辗转相除 ...

  4. BZOJ 4031: [HEOI2015]小Z的房间 (矩阵树定理 板题)

    背结论 : 度-邻 CODE1 O(n3logn)O(n^3logn)O(n3logn) #include <bits/stdc++.h> using namespace std; typ ...

  5. [HEOI2015] 小Z的房间 - 矩阵树定理

    #include <bits/stdc++.h> using namespace std; #define int long long const int N = 105; const i ...

  6. bzoj 4031: 小Z的房间 矩阵树定理

    bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...

  7. LG4111/LOJ2122 「HEOI2015」小Z的房间 矩阵树定理

    问题描述 LG4111 题解 矩阵树定理板子题. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; #defin ...

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

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

  9. bzoj4031 [HEOI2015]小Z的房间

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

随机推荐

  1. hdu 2126 Buy the souvenirs 买纪念品(01背包,略变形)

    题意: 给出一些纪念品的价格,先算出手上的钱最多能买多少种东西k,然后求手上的钱能买k种东西的方案数.也就是你想要买最多种东西,而最多种又有多少种组合可选择. 思路: 01背包.显然要先算出手上的钱m ...

  2. nodejs安装遇到npm命令无法使用问题

    解决方法: 在用户文件夹中建立npm文件夹就可以使用了. 再使用npm命令就可以了.

  3. Bootstrap标签页(Tab)插件事件

    事件 下表列出了标签页(Tab)插件中要用到的事件.这些事件可在函数中当钩子使用. 事件 描述 实例 show.bs.tab 该事件在标签页显示时触发,但是必须在新标签页被显示之前.分别使用 even ...

  4. Windows系统安装docker

    下载安装包 官网 点击 Get Started ,打开入门页面,往下拉,找到 Download for Windows 打开 下载页面 ,点击 Please Login To Download ,要注 ...

  5. IOS中将颜色转换为image

    - (UIImage *)createImageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f ...

  6. A. Vitya in the Countryside

    A. Vitya in the Countryside time limit per test 1 second memory limit per test 256 megabytes input s ...

  7. 【贪心】bzoj1577: [Usaco2009 Feb]庙会捷运Fair Shuttle

    一类经典的线段贪心 Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i ...

  8. intellij idea 下载安装破解教程

    官网下载:http://www.jetbrains.com/idea/download/#section=windows 选择  Ultimate 版本下载 下载完成后,打开安装 在安装路径位置,可以 ...

  9. Linux-缓存服务

    Memcached 基本操作 解释 命令 安装 yum install memcached 启动 memcached -d -l -m -p 停止 kill pid 查看某个端口是否通:telnet ...

  10. C# NotifyIcon 托盘控件

    右下角以图标形式显示,双击图标显示界面,最小化界面时不显示在任务栏. 第一步:在界面上添加NotifyIcon控件. 第二步:设置notifyIcon1的属性,添加图标,将Visible设为true. ...