【bzoj4031】[HEOI2015]小Z的房间

Description

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

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

Input

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

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

Output

一行一个整数,表示合法的方案数 \(\bmod 10^9\)

HINT

对于前\(100\%\)的数据,\(n,m\le 9\)


矩阵树定理,发现模数不为质数,所以在高斯消元的时候辗转相除就可以了。

注意要统计行列式正负性,因为\(x\)和\(mod-x\)没法直接判断

复杂度多带一个\(\log\)


#include <cstdio>
#include <algorithm>
const int N=100;
const int mod=1e9;
char c[10][10];
int n,m,a[N][N],p[N][N],cnt,ans=1,f=1;
const int dx[5]={0,0,1,0,-1};
const int dy[5]={0,-1,0,1,0};
void Gauss()
{
for(int i=1;i<=n;i++)
{
if(!a[i][i]) return;
for(int j=i+1;j<=n;j++)
{
while(a[i][i])
{
int d=a[j][i]/a[i][i];
for(int k=i;k<=n;k++)
a[j][k]=(a[j][k]+mod-1ll*d*a[i][k]%mod)%mod;
std::swap(a[i],a[j]);
f*=-1;
}
std::swap(a[i],a[j]);
f*=-1;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("\n");
for(int j=1;j<=m;j++)
{
scanf("%c",&c[i][j]);
if(c[i][j]=='.') p[i][j]=++cnt;
}
}
for(int i=1;i<=n;i++)
for(int u,j=1;j<=m;j++)//’.’代表房间,’*’代表柱子
if(u=p[i][j])
{
for(int v,k=1;k<=4;k++)
{
int ti=i+dx[k],tj=j+dy[k];
if(v=p[ti][tj])
++a[u][u],--a[u][v];
}
}
n=cnt-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
(a[i][j]+=mod)%=mod;
Gauss();
int ans=1;
for(int i=1;i<=n;i++) ans=(1ll*ans*a[i][i])%mod;
ans=f==1?ans:mod-ans;
printf("%d\n",ans);
return 0;
}

2018.12.20

最新文章

  1. Tableau未必最佳,国内BI也能突破重围!
  2. iOS开发系列文章(持续更新……)
  3. 我的bootstrapTable的应用
  4. svn 架设
  5. an interview question(2)
  6. 发布园友设计的新款博客皮肤BlueSky
  7. ThinkPHP 3.2.3 简单后台模块开发(二)RBAC
  8. quartz定时任务时间设置
  9. mvn编写主代码与测试代码
  10. SqlBulkCopy 插入100W条数据时 属性BatchSize的作用
  11. IOS动态修改按钮响应时间
  12. Swift 语言概览 -自己在Xcode6 动手写1
  13. 通讯录--(iOS9独有的方法)
  14. java多线程(四)-自定义线程池
  15. 如何使用 Q#
  16. BigDecimal 专题
  17. 计算机硬件&amp;操作系统
  18. iOS----------YYModel
  19. 内联元素padding与高度可控的分隔线实例页面
  20. [转]Docker容器可视化监控中心搭建

热门文章

  1. Datawhale MySQL 训练营 Task2 查询语句
  2. ats Linux Bridge内联
  3. 投稿007期|令人震惊到发指的PyObject对象代码设计之美
  4. [shell] bash数组(for时排序)
  5. nginx keepalived 高可用方案(转)
  6. redis高级应用(集群搭建、集群分区原理、集群操作)
  7. 第十二次作业psp
  8. Scrum Meeting 12 -2014.11.18
  9. binding(转)
  10. Alpha版本冲刺(三)