题意

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. Codeforces--C2. Good Numbers (hard version)

    题目链接http://codeforces.com/contest/1249/problem/C2.这是道进制转换题,我们的目的是找到最小的一个每个位都是1的三进制数来表示一个十进制数n.做法是,先将 ...

  2. MSSQL字符串取相应的第几个数组值

    create function Get_StrArrayStrOfIndex( @str varchar(5000), --要分割的字符串 @split varchar(10), --分隔符号 @in ...

  3. 继承以及Super

    一个小小的总结,主要关注以下三个问题:ES5的继承方式,ES5的继承与ES6的继承的区别,ES6的super的几种使用方式以及其中this的指向. From http://supermaryy.com ...

  4. DOM事件练习 II

    select框联动效果 需求:当在textarea中输入内容,点击留言按钮,会添加到浏览器中,最新留言出现在最顶端. <!DOCTYPE html> <html lang=" ...

  5. python学习之数据类型(int,bool,str)

    第三章 数据类型 3.1 Python基本数据类型 类型 含义 描述 int 整数 主要用来进⾏数学运算 str 字符串 可以保存少量数据并进⾏相应的操作 bool 布尔值 判断真假,True,Fal ...

  6. PJzhang:国外主流站点钓鱼网站示例工具shellphish

    猫宁!!! 参考链接:https://www.uedbox.com/post/58583/ 这个是这个项目的github地址 https://github.com/thelinuxchoice/she ...

  7. 机器学习笔记:支持向量机(svm)

    支持向量机(svm)英文为Support Vector Machines 第一次接触支持向量机是2017年在一个在线解密游戏"哈密顿行动"中的一个关卡的二分类问题,用到了台湾教授写 ...

  8. Emgu 学习之HelloWorld

    安装和配置 系统Win10,VS2013,下载Emgu安装包libemgucv-windesktop-3.4.3.3016 安装到了E:\OpenCV\emgucv-windesktop 3.4.3. ...

  9. Django2.2 连接mySQL数据库

    一.Django2.2连接数据库(踩雷) 首先,Django2.2自带的是sqlite3数据库,但我们学的是mysql,因此学着连接(在mysql环境搭建成功的情况下)---参考博客: https:/ ...

  10. 小菜鸟之oracle数据字典

    oracle数据字典 一.数据字典 数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询.数据字典是oracle数据库系统的信息核心,它是一组提供有关数 ...