【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)
来两道矩阵树模板:
T1:【bzoj4031】[HEOI2015]小Z的房间
Description
你想要打通一些相邻房间的墙,使得所有房间能够互相到达。在此过程中,你不能把房子给打穿,或者打通柱子(以及柱子旁边的墙)。同时,你不希望在房子中有小偷的时候会很难抓,所以你希望任意两个房间之间都只有一条通路。现在,你希望统计一共有多少种可行的方案。
Input
接下来n行,每行m个字符,每个字符都会是’.’或者’*’,其中’.’代表房间,’*’代表柱子。
Output
题解:
这是一道典型的矩阵树裸题……
不过,这取模 10^9 不是质数,不能普通的高斯消元,要使用辗转相除法。
int f=;
for(int i=;i<cnt;i++){
for(int j=i+;j<=cnt;j++){
while(a[j][i]){
int t=a[j][i]/a[i][i];
for(int k=i;k<=cnt;k++)
a[j][k]=(a[j][k]-1LL*a[i][k]*t%mod+mod)%mod;
if(a[j][i]==)break;
for(int k=i;k<=cnt;k++)swap(a[i][k],a[j][k]);
f=-f;
}
}
}
这里涉及到交换,貌似统计答案要变为相反数……
COMPLETE CODE:
#include<cstdio>
#include<algorithm>
using namespace std; #define mod 1000000000
int n,m,cnt,ans=,a[][],id[][];
char s[]; int qpow(int x,int y){
int ans=;
while(y){
if(y&)ans=1LL*ans*x%mod;
y>>=,x=1LL*x*x%mod;
}
return ans;
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%s",s+);
for(int j=;j<=m;j++){
if(s[j]=='*')continue;
id[i][j]=++cnt;
if(id[i-][j]){
a[id[i-][j]][id[i][j]]--;
a[id[i][j]][id[i-][j]]--;
a[id[i][j]][id[i][j]]++;
a[id[i-][j]][id[i-][j]]++;
}if(id[i][j-]){
a[id[i][j-]][id[i][j]]--;
a[id[i][j]][id[i][j-]]--;
a[id[i][j]][id[i][j]]++;
a[id[i][j-]][id[i][j-]]++;
}
}
}
cnt--;
for(int i=;i<=cnt;i++)
for(int j=;j<=cnt;j++)
if(a[i][j]<)a[i][j]+=mod;
int f=;
for(int i=;i<cnt;i++){
for(int j=i+;j<=cnt;j++){
while(a[j][i]){
int t=a[j][i]/a[i][i];
for(int k=i;k<=cnt;k++)
a[j][k]=(a[j][k]-1LL*a[i][k]*t%mod+mod)%mod;
if(a[j][i]==)break;
for(int k=i;k<=cnt;k++)swap(a[i][k],a[j][k]);
f=-f;
}
}
}
for(int i=;i<=cnt;i++)
ans=1LL*ans*a[i][i]%mod;
printf("%d",~f?ans:(mod-ans)%mod);
}
T2:【bzoj4894】天赋
Description
Input
接下来是一个n*n的01矩阵,第i行第j列为1表示习得天赋j的一个前置天赋为i。
数据保证第一列和主对角线全为0。
n<=300
Output
题解:
这是一道有向图生成树计数的裸题……
没什么好说的。
CODE:
#include<iostream>
#include<cstdio>
using namespace std; #define mod 1000000007
char s[];
int n,a[][],ans=; int qpow(int x,int y){
int ans=;
while(y){
if(y&)ans=1LL*ans*x%mod;
y>>=,x=1LL*x*x%mod;
}
return ans;
} void Gauss(){
for(int i=;i<n;i++){
for(int j=i+;j<=n;j++){
if(a[j][i]==)continue;
if(a[i][i]==){
putchar('');
exit();
}
int tmp=1ll*a[j][i]*qpow(a[i][i],mod-)%mod;
for(int k=i;k<=n;k++)
a[j][k]=(a[j][k]-1ll*a[i][k]*tmp%mod+mod)%mod;
}
}
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s+);
for(int j=;j<=n;j++)
if(s[j]=='')a[j][i]=-,a[j][j]++;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(a[i][j]<)a[i][j]+=mod;
Gauss();
for(int i=;i<=n;i++)
ans=1LL*ans*a[i][i]%mod;
printf("%d",ans);
}
【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)的更多相关文章
- BZOJ4031 [HEOI2015]小Z的房间 【矩阵树定理 + 高斯消元】
题目链接 BZOJ4031 题解 第一眼:这不裸的矩阵树定理么 第二眼:这个模\(10^9\)是什么鬼嘛QAQ 想尝试递归求行列式,发现这是\(O(n!)\)的.. 想上高斯消元,却又处理不了逆元这个 ...
- BZOJ 4031: [HEOI2015]小Z的房间 高斯消元 MartixTree定理 辗转相除法
4031: [HEOI2015]小Z的房间 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个 ...
- bzoj4031 [HEOI2015]小Z的房间
Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...
- BZOJ4894:天赋(矩阵树定理)
Description 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有一些天赋必须是要有前置天赋才能够学习得到的. 也就是说,有一些天赋必须是要在 ...
- bzoj4031 [HEOI2015]小Z的房间——矩阵树定理
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4031 矩阵树定理的模板题(第一次的矩阵树定理~): 有点细节,放在注释里了. 代码如下: # ...
- 【bzoj4031】[HEOI2015]小Z的房间 解题报告
[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...
- 【bzoj4031】[HEOI2015]小Z的房间 Matrix-Tree定理+高斯消元
[bzoj4031][HEOI2015]小Z的房间 2015年4月30日3,0302 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的 ...
- 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 矩阵树定理 关于 ...
随机推荐
- vue入坑教程(二)在vue项目中如何导入element以及sass
在项目中导入element以及sass.stylus等方便开发的工具以及UI框架 (1)如何在vue项目中导入elementUI框架 elementUI是饿了么团队开发出来基于vue的前端UI框架,其 ...
- 【二分 最小割】cf808F. Card Game
Digital collectible card games have become very popular recently. So Vova decided to try one of thes ...
- tomcat如何登录Server Status、Manager App、Host Manager
启动tomcat后,访问127.0.0.1会进入如下页面 版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址:https://www.cnblogs.com/poterliu/p/9602 ...
- vue 使用lib-flexable,px2rem 进行移动端适配 但是引入的第三方UI组件 vux 的样式缩小,解决方案
最近在写移动端项目,就想用lib-flexable,px2rem来进行适配,把px转换成rem但是也用到了第三方UI组件库vux,把这个引入发现一个问题就是vux的组件都缩小了,在网上找不到答案,最后 ...
- paper:synthesizable finit state machine design techniques using the new systemverilog 3.0 enhancements之enhanced coding styles
1.ANSI style 的代码比较紧凑. 下面规范推荐,比较好. 下面是带有parameter的module header的完整规范 一般1bit ,大家都是wire signal1 = gen_s ...
- setup/hold 分析
分析说明:D2:目的寄存器:D1:源寄存器: edge2:下一个时钟上升沿:edge1:当前时钟上升沿:edge0:当前时钟上升沿的前一个时钟沿:如下图: 建立时间:触发器D2(数据要到达目的的地方) ...
- 事务控制语言DTL
一.什么是事务? · 数据库中的事务,是指可以将“多条相关语句执行”看做是“一条语句执行”的一种内部机制.即事务是一种可以保证“多条语句一次性执行完成”或者一条语句都不执行的机制. 三.事务的特点 原 ...
- 使用GD库做图片水印
png图片作为水印加到其他类型图片后,背景变黑色 原因: imagecopy函数拷贝时可以保留png图像的原透明信息,而imagecopymerge却不支持图片的本身的透明拷贝. 然后直接上代码: / ...
- 通过composer安装阿里大于接口扩展
# 安装laravel阿里大鱼服务 composer require iscms/alisms-for-laravel laravel配置 # 注册服务 # 在config\app.php文件中找到P ...
- 线段树、前缀数组:HDU1591-Color the ball(区间更新、简单题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...