题意:求某网格图生成树个数,对1e9取模

题解:题目是裸的Matrix-Tree定理,这不是我要说的重点,重点是对于这个取模的处理。

由于这不是个质数,所以不能直接乘逆元来当除法用。直接高斯消元肯定是不行的,须要一定实现的小技巧。

我们能够考虑gcd的实现过程,辗转相除直到一个为0。多么好的思路,对于这个问题我们也能够这样处理。每次减掉对应的倍数就可以

以下是代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef double db;
  5. const int inf=0x3f3f3f3f;
  6. int getint()
  7. {
  8. int f=1,g=0;char c=getchar();
  9. while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
  10. while(c>='0' && c<='9')g=(g<<3)+(g<<1)+c-'0',c=getchar();
  11. return f*g;
  12. }
  13. const int maxn=105;
  14. const int maxl=10;
  15. const int mod=1000000000;
  16. const int dx[]={0,0,-1,1};
  17. const int dy[]={1,-1,0,0};
  18. char c[maxl][maxl];
  19. ll a[maxn][maxn];
  20. int pos[maxn][maxn];
  21. int tot;
  22. ll det(int n)
  23. {
  24. for(int i=1;i<=n;i++)
  25. {
  26. for(int j=1;j<=n;j++)
  27. {
  28. a[i][j]=(a[i][j]+mod)%mod;
  29. }
  30. }
  31. ll f=1,res=1ll;
  32. for(int i=1;i<=n;i++)
  33. {
  34. for(int j=i+1;j<=n;j++)
  35. {
  36. int a1=a[i][i];
  37. int b1=a[j][i];
  38. while(b1!=0)
  39. {
  40. ll temp=a1/b1;
  41. a1%=b1;swap(a1,b1);
  42. for(int k=i;k<=n;k++)
  43. {
  44. a[i][k]=(a[i][k]-temp*a[j][k]%mod+mod)%mod;
  45. }
  46. for(int k=i;k<=n;k++)
  47. {
  48. swap(a[i][k],a[j][k]);
  49. }
  50. f=-f;
  51. }
  52. }
  53. if(!a[i][i])return 0;
  54. res=res*a[i][i]%mod;
  55. }
  56. res*=f;
  57. res=(res+mod)%mod;
  58. return res;
  59. }
  60. int main()
  61. {
  62. // freopen("in.txt","r",stdin);
  63. int n=getint();
  64. int m=getint();
  65. for(int i=1;i<=n;i++)
  66. {
  67. scanf("%s",c[i]+1);
  68. for(int j=1;j<=m;j++)
  69. {
  70. if(c[i][j]!='*')pos[i][j]=++tot;
  71. }
  72. }
  73. for(int i=1;i<=n;i++)
  74. {
  75. for(int j=1;j<=m;j++)
  76. {
  77. if(!pos[i][j])continue;
  78. for(int k=0;k<4;k++)
  79. {
  80. int tx=i+dx[k];
  81. int ty=j+dy[k];
  82. if(ty<1 || tx<1 || tx>n || ty>m || !pos[tx][ty])continue;
  83. a[pos[i][j]][pos[i][j]]++;
  84. a[pos[i][j]][pos[tx][ty]]--;
  85. }
  86. }
  87. }
  88. printf("%d\n",det(tot-1));
  89. return 0;
  90. }

BZOJ4031——HEOI小z的房间的更多相关文章

  1. 【BZOJ4031】小Z的房间(矩阵树定理)

    [BZOJ4031]小Z的房间(矩阵树定理) 题面 BZOJ 洛谷 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子 ...

  2. 【BZOJ-4031】小z的房间 Matrix-Tree定理 + 高斯消元解行列式

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 937  Solved: 456[Submit][Statu ...

  3. bzoj4031 [HEOI2015]小Z的房间

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

  4. 【BZOJ4031】小Z的房间

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

  5. BZOJ4031 [HEOI2015]小Z的房间 【矩阵树定理 + 高斯消元】

    题目链接 BZOJ4031 题解 第一眼:这不裸的矩阵树定理么 第二眼:这个模\(10^9\)是什么鬼嘛QAQ 想尝试递归求行列式,发现这是\(O(n!)\)的.. 想上高斯消元,却又处理不了逆元这个 ...

  6. bzoj4031 [HEOI2015]小Z的房间——矩阵树定理

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4031 矩阵树定理的模板题(第一次的矩阵树定理~): 有点细节,放在注释里了. 代码如下: # ...

  7. [BZOJ 4031][LOJ 2122][HEOI 2015] 小Z的房间

    [BZOJ 4031][LOJ 2122][HEOI 2015] 小Z的房间 题意 给定一个 \(n\times m\) 的矩阵, 一些格子是障碍, 相邻的格子(四联通)之间可以连边, 求把非障碍的格 ...

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

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

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

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

随机推荐

  1. c#约瑟环实现

    约瑟环问题就是有n个人坐成一个圈.从某个人开始报数,数到m的人出列,接着从列出的下一个人开始重新报数,数到m的人再次出列,如此循环,直到所有的人都出列,最后按出列的顺序输出.

  2. Gym-100935I Farm 计算几何 圆和矩形面积交

    题面 题意:就是给你一个圆,和你一个矩形,求面积并,且 保证是一种情况:三角剖分后 一个点在圆内 两个在圆外 题解:可以直接上圆与凸多边形交的板子,也可以由这题实际情况,面积等于扇形减两个三角形 #i ...

  3. MongoDB实现数组中重复数据删除

    这个功能真的是写死我了,对于MongoDB一点都不熟悉,本来想使用spring与MongoDB的融合mongoDBTemplate,发现压根不是web项目,懒得配置那些配置文件,就使用最原始的数据库操 ...

  4. linux 标准输出和后台运行

    一.后台运行程序 至需要在命令后面加上一个 & 即可 # command & 例如: python test.py & 二.标准输出.标准错误输出 # command > ...

  5. postgresql 常规操作以及检查备份

    一.建表时,复制源表的信息test=# test=# \d test.t1 Table "test.t1" Column | Type | Collation | Nullable ...

  6. iOS数组越界

    数组越界就是假如你的下标总数现在为32个,然后你在下一秒又执行了一个方法要从50个数据里进行赋值啊筛选之类的,而你此时数组里的值为32个,50的数据还没有请求到,往往会出现数组越界的崩溃信息,大概是这 ...

  7. B - Letter(最小覆盖矩形)

    Problem description A boy Bob likes to draw. Not long ago he bought a rectangular graph (checked) sh ...

  8. 多个tomcat配置,解决冲突问题

    一.一般修改 路径: /opt/apache-tomcat/conf/server.xml 1.第一个tomcat使用默认配置 2.第二个tomcat一般配置 二.特殊修改 1.第二个tomcat特殊 ...

  9. winfrom窗体属性

  10. 备忘录模式(Memento)C++实现

    备忘录模式 意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将改对象恢复到原先保存的状态. 适用性: 1.必须保存一个对象在某一个时刻的部分状态,这样以 ...