【HEOI2015】小Z的房间
题意
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的房间的更多相关文章
- 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 矩阵树定理 关于 ...
- 【bzoj4031】[HEOI2015]小Z的房间 解题报告
[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...
- 【BZOJ 4031】 4031: [HEOI2015]小Z的房间 (Matrix-Tree Theorem)
4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1089 Solved: 533 Description ...
- BZOJ 4031: [HEOI2015]小Z的房间 高斯消元 MartixTree定理 辗转相除法
4031: [HEOI2015]小Z的房间 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个 ...
- 【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的房间
Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...
- P4111 [HEOI2015]小Z的房间 生成树计数
这个题是生成树计数的裸题,中间构造基尔霍夫矩阵,然后构成行列式,再用高斯消元就行了.这里高斯消元有一些区别,交换两行行列式的值变号,且消元只能将一行的数 * k 之后加到别的行上. 剩下就没啥了... ...
- bzoj4031 [HEOI2015]小Z的房间
Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...
随机推荐
- sql(存储过程,事务,索引,游标,触发器)
1.SqlServer中like '%_%'来匹配下划线: --在sql server的like中下划线类似于通配符%,所以无法使用like '%_%'来匹配下划线 select * from cla ...
- 查看自身公网ip的命令
curl ifconfig.me curl cip.cc curl ipinfo.io
- C#作业系统中的安全系统
比赛条件 编写多线程代码时,总是存在竞争条件的风险.当一个操作的输出取决于其控制之外的另一个过程的定时时,发生竞争条件. 竞争条件并不总是一个错误,但它是不确定行为的来源.当竞争条件确实导致错误时,可 ...
- android webview 访问 https 页面
在android 中利用webview 控件进行开发过程中,可能会遇到 webview 访问不了https://的页面如 https://www.google.com.hk 重写onReceivedS ...
- ORACLE 更新 和 插入多条 数据
--插入语句INSERT INTO OA_W_BAOXIAOMXYWB (ID,DONGTAITABLEPARENTSN,CHANPINNAMEGKFK,CHANPINJITIGKFK,CHANPIN ...
- SqlService 数据操作
存储过程: if exists(select * from sysobjects where name='proce_name') drop procedure proce_name go creat ...
- Java内存模型(三)原子性、内存可见性、重排序、顺序一致性、volatile、锁、final
一.原子性 原子性操作指相应的操作是单一不可分割的操作.例如,对int变量count执行count++d操作就不是原子性操作.因为count++实际上可以分解为3个操作:(1)读取变量co ...
- 修改state(react)中的某一个对象中的单个参数
react项目中我们经常会涉及到修改state中参数的问题,如果参数为常用的基本类型变量,我们可以直接通过this.setState({...})方法来进行修改,但是如果变量为一个对象我们要如何修改呢 ...
- 第七次java实验报告
Java实验报告 班级 计科二班 学号20188437 姓名 何磊 完成时间 2019/10/25 评分等级 实验四 类的继承 实验内容 )总票数1000张:(2)10个窗口同时开始卖票:(3)卖票过 ...
- CSS3鼠标滑过图片3D旋转动画
在线演示 本地下载