题意

https://www.luogu.org/problemnew/show/P4111

题解

前置知识:矩阵树定理

不要问证明,我不会,用就完事了(反正一般也不会用到)

因为矩阵树定理就是求一张 $n$ 个点的简单无向图的生成树个数,时间复杂度为 $O(n^3)$,再看看这道题的数据范围,$n,m\le 9$,直接矩阵树定理就可以了……

注意因为我们要求方案数,这个数可能很大,而我们用高斯消元把矩阵消成上三角的话,由于要用 $double$,会出现精度误差,这种小数运算的误差在这种求方案数的题中是不允许的(因为方案数就是一个准确的整数,没有保留几位小数之说)。所以这里采用辗转相除法把高斯消元的非整数倍消元 转成多次整数倍消元,具体实现见代码,就是对矩阵的两行进行类似于辗转相除的操作。总时间复杂度就在普通 $O(n^3)$ 高消基础上 乘上每次辗转相除的复杂度(辗转相除的复杂度是 $O(辗转相除的两数中较小数在斐波那契数列的第几项)$)。

upd:时间复杂度应该是 $O(n^3+n^2 P)$($P$ 是模数,即值域),而不是网上大部分题解说的 $O(n^3 \log{P})$。证明(因为辗转相除的次数接近 $log$,我们可以近似地用 $log$ 表示辗转相除的复杂度):

 #include<bits/stdc++.h>
#define ll long long
#define N 110
#define p 1000000000
using namespace std;
const int dx[] = {-, }, dy[] = {, -};
inline int read(){
int x = ; bool f = ; char c = getchar();
for(; !isdigit(c); c=getchar()) if(c == '-') f = ;
for(; isdigit(c); c=getchar()) x = (x<<) + (x<<) + (c^'');
if(f) return x;
return - x;
}
int n, m, tot, id[N][N];
bool e[N][N];
ll d[N][N];
char s[N];
ll solve(){
int n = tot - ;
bool tr = ;
ll ans = ; for(int i=; i<=n; ++i){
for(int j=i+; j<=n; ++j){
while(d[j][i]){
ll tmp = d[i][i] / d[j][i];
for(int k=; k<=n; ++k){ //辗转相除
d[i][k] = (d[i][k] - tmp * d[j][k] % p + p) % p;
swap(d[i][k], d[j][k]);
}
tr ^= ;
}
}
if(!d[i][i]) return ;
ans = ans * d[i][i] % p;
}
if(tr) ans = p - ans; //原型是 ans = -ans,交换奇数次行时,行列式值要取负
return ans;
}
int main(){
n = read(), m = read();
for(int i=; i<=n; ++i){
scanf("%s", s+);
for(int j=; j<=m; ++j)
if(s[j] == '.') e[i][j] = ;
}
for(int i=; i<=n; ++i){
for(int j=; j<=m; ++j){
if(!e[i][j]) continue;
id[i][j] = ++tot;
int u = id[i][j];
for(int k=; k<; ++k){
int x = i + dx[k], y = j + dy[k];
if(!e[x][y]) continue;
int v = id[x][y];
++d[u][u], ++d[v][v],
d[u][v] = (d[u][v] - + p) % p, d[v][u] = (d[v][u] - + p) % p;
}
}
}
cout << solve() << endl;
return ;
}

【HEOI2015】小Z的房间的更多相关文章

  1. bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 98  Solved: 29[Submit][Status] ...

  2. [HEOI2015]小Z的房间 && [CQOI2018]社交网络

    今天看了一下矩阵树定理,然后学了一下\(O(n ^ 3)\)的方法求行列式. 哦对了,所有的证明我都没看-- 这位大佬讲的好呀: [学习笔记]高斯消元.行列式.Matrix-Tree 矩阵树定理 关于 ...

  3. 【bzoj4031】[HEOI2015]小Z的房间 解题报告

    [bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...

  4. 【BZOJ 4031】 4031: [HEOI2015]小Z的房间 (Matrix-Tree Theorem)

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1089  Solved: 533 Description ...

  5. BZOJ 4031: [HEOI2015]小Z的房间 高斯消元 MartixTree定理 辗转相除法

    4031: [HEOI2015]小Z的房间 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个 ...

  6. 【bzoj4031】[HEOI2015]小Z的房间 Matrix-Tree定理+高斯消元

    [bzoj4031][HEOI2015]小Z的房间 2015年4月30日3,0302 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的 ...

  7. 【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)

    来两道矩阵树模板: T1:[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形 ...

  8. 【刷题】BZOJ 4031 [HEOI2015]小Z的房间

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

  9. P4111 [HEOI2015]小Z的房间 生成树计数

    这个题是生成树计数的裸题,中间构造基尔霍夫矩阵,然后构成行列式,再用高斯消元就行了.这里高斯消元有一些区别,交换两行行列式的值变号,且消元只能将一行的数 * k 之后加到别的行上. 剩下就没啥了... ...

  10. bzoj4031 [HEOI2015]小Z的房间

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

随机推荐

  1. HTTP Status 500 – Internal Server Error

    明明硬盘中存在users.xml,但是提示:系统找不到指定的路径. 解决办法: 设置String的编码格式 realpath = URLDecoder.decode(realpath, "U ...

  2. java:redis(redis安装配置,redis的伪集群配置)

    1.redis安装配置: .安装gcc : yum install gcc-c++ .使用FTP工具FileZilla上传redis安装包到linux根目录下(当前步骤可以替换为:在root目录下执行 ...

  3. 基于OpenCV的循环行、列移动函数circShift()

    ///*12 在Matlab中有个circShift()函数,可以实现行.列的循环移动 /// 在返卷积运算中,会用到这个函数.所以,在Opencv中我也定义同样 /// 功能的函数 /// 该函数有 ...

  4. “vmware 未能初始化监视器设备”的解决方法

    从挂起状态唤醒时出现"vmware 未能初始化监视器设备"的提示,在cmd中输入命令 net start vmci net start vmx86 可能还不能成功启动,提示&quo ...

  5. Vue实现点击时间获取时间段查询功能

    二话不说,先上图 实现如上代码: //获取本周第一天 showWeekFirstDay: function () { let Nowdate = new Date(); let WeekFirstDa ...

  6. webdriervAPI(元素等待)

    from  selenium  import  webdriver from selenium.common.exceptions import NoSuchElementException driv ...

  7. svn修改代码URL整合路径

    我们平常开发的代码都是在A服务器上整合的,最近A服务器突然无法访问了,所以今天我们更换了一下服务器.svn如何安装的就不说了,这里只介绍一下如何更换SVN URL的. 在你拿到URL后,在工作文件夹下 ...

  8. 快速排序基本思想,递归写法,python和java编写快速排序

    1.基本思想 快速排序有很多种编写方法,递归和分递归,分而治之法属于非递归,比递归简单多了.在这不使用代码演示.下面我们来探讨一下快速排序的递归写法思想吧. 设要排序的数组是A[0]……A[N-1], ...

  9. 【VS开发】关于内存泄漏的调试

    没想到造成泄漏的原因是由于保存数据的线程因为事件阻塞在那里,此时要关闭OnClose的时候,这个挂起的线程爆出了内存泄漏,所以在关闭窗口之前,需要SetEvent(m_hSaveDataEvent); ...

  10. Map以及HashMap

    本文主要介绍java集合框架的Map集合,在日常生活中Map的运用也十分广泛. 与List集合.Set集合隶属于Collection不同,Map是一个独立的接口,与Collection相同级别的接口. ...