背结论 : 度-邻

CODE1

O(n3logn)O(n^3logn)O(n3logn)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. template<class T>inline void read(T &num) {
  5. register char ch; register int flg = 1;
  6. while(!isdigit(ch=getchar()))if(ch=='-')flg=-flg;
  7. for(num=0; isdigit(ch); num=num*10+ch-'0', ch=getchar());
  8. num *= flg;
  9. }
  10. const int MAXN = 85;
  11. const int mod = 1e9;
  12. int n, m, tot, id[10][10];
  13. int a[MAXN][MAXN], d[MAXN][MAXN], g[MAXN][MAXN];
  14. char s[10];
  15. inline void link(int u, int v) {
  16. ++d[u][u], ++d[v][v];
  17. ++g[u][v], ++g[v][u];
  18. }
  19. inline int Gauss(int N) { //高斯消元成上三角
  20. int ans = 1;
  21. for(int i = 1; i <= N; ++i) {
  22. for(int k = i+1; k <= N; ++k)
  23. while(a[k][i]) { //这里有一个log
  24. int d = a[i][i] / a[k][i];
  25. for(int j = i; j <= N; ++j)
  26. a[i][j] = ((a[i][j] - 1ll * d * a[k][j] % mod) % mod + mod) % mod;
  27. swap(a[i], a[k]), ans = -ans; //注意每交换两行都要取反
  28. }
  29. ans = (1ll * ans * a[i][i] % mod + mod) % mod;
  30. }
  31. return ans;
  32. }
  33. int main() {
  34. read(n), read(m);
  35. for(int i = 1; i <= n; ++i) {
  36. scanf("%s", s+1);
  37. for(int j = 1; j <= m; ++j)
  38. if(s[j] != '*') {
  39. id[i][j] = ++tot;
  40. if(id[i-1][j]) link(tot, id[i-1][j]);
  41. if(id[i][j-1]) link(tot, id[i][j-1]);
  42. }
  43. }
  44. for(int i = 1; i < tot; ++i)
  45. for(int j = 1; j < tot; ++j)
  46. a[i][j] = d[i][j] - g[i][j];
  47. printf("%d\n", (Gauss(tot-1) + mod) % mod);
  48. }

CODE2

O(n3+n2logn)→O(n3)O(n^3+n^2logn)\to O(n^3)O(n3+n2logn)→O(n3)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. template<class T>inline void read(T &num) {
  5. register char ch; register int flg = 1;
  6. while(!isdigit(ch=getchar()))if(ch=='-')flg=-flg;
  7. for(num=0; isdigit(ch); num=num*10+ch-'0', ch=getchar());
  8. num *= flg;
  9. }
  10. const int MAXN = 85;
  11. const int mod = 1e9;
  12. int n, m, tot, id[10][10];
  13. int a[MAXN][MAXN], d[MAXN][MAXN], g[MAXN][MAXN];
  14. char s[10];
  15. inline void link(int u, int v) {
  16. ++d[u][u], ++d[v][v];
  17. ++g[u][v], ++g[v][u];
  18. }
  19. inline void kill(int a, int b, int &ii, int &ik, int &ki, int &kk, int &sign) {
  20. ii = 1, ik = 0;
  21. ki = 0, kk = 1;
  22. sign = 1;
  23. while(b) {
  24. (ii -= a/b * ki) %= mod;
  25. (ik -= a/b * kk) %= mod;
  26. a -= a/b * b;
  27. swap(a, b);
  28. swap(ii, ki);
  29. swap(ik, kk);
  30. sign = -sign;
  31. }
  32. }
  33. inline int Gauss(int N) {
  34. int ans = 1, ii, ik, ki, kk, sign;
  35. for(int i = 1; i <= N; ++i) {
  36. for(int k = i+1; k <= N; ++k) if(a[k][i]) {
  37. kill(a[i][i], a[k][i], ii, ik, ki, kk, sign); //先把系数算出来
  38. ans *= sign;
  39. for(int j = i; j <= N; ++j) {
  40. int _aij = (1ll * a[i][j] * ii + 1ll * a[k][j] * ik) % mod;
  41. int _akj = (1ll * a[i][j] * ki + 1ll * a[k][j] * kk) % mod;
  42. a[i][j] = _aij, a[k][j] = _akj;
  43. }
  44. }
  45. ans = 1ll * ans * a[i][i] % mod;
  46. }
  47. return ans;
  48. }
  49. int main() {
  50. read(n), read(m);
  51. for(int i = 1; i <= n; ++i) {
  52. scanf("%s", s+1);
  53. for(int j = 1; j <= m; ++j)
  54. if(s[j] != '*') {
  55. id[i][j] = ++tot;
  56. if(id[i-1][j]) link(tot, id[i-1][j]);
  57. if(id[i][j-1]) link(tot, id[i][j-1]);
  58. }
  59. }
  60. for(int i = 1; i < tot; ++i)
  61. for(int j = 1; j < tot; ++j)
  62. a[i][j] = d[i][j] - g[i][j];
  63. printf("%d\n", (Gauss(tot-1) + mod) % mod);
  64. }

BZOJ 4031: [HEOI2015]小Z的房间 (矩阵树定理 板题)的更多相关文章

  1. BZOJ 4031: [HEOI2015]小Z的房间 [矩阵树定理 行列式取模]

    http://www.lydsy.com/JudgeOnline/problem.php?id=4031 裸题........ 问题在于模数是$10^9$ 我们发现消元的目的是让一个地方为0 辗转相除 ...

  2. 【bzoj4031】[HEOI2015]小Z的房间 矩阵树定理

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

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

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

  4. BZOJ 4031 [HEOI2015]小Z的房间(Matrix-Tree定理)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4031 [题目大意] 你突然有了一个大房子,房子里面有一些房间. 事实上,你的房子可以看 ...

  5. BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)

    题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...

  6. [HEOI2015]小Z的房间(矩阵树定理学习笔记)

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

  7. [HEOI2015] 小Z的房间 - 矩阵树定理

    #include <bits/stdc++.h> using namespace std; #define int long long const int N = 105; const i ...

  8. bzoj 4031: 小Z的房间 矩阵树定理

    bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...

  9. bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 98  Solved: 29[Submit][Status] ...

随机推荐

  1. 超级实用的 Java 工具类

    超级实用的 Java 工具类 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取 ...

  2. 27-Perl 进程管理

    1.Perl 进程管理Perl 中你可以以不同的方法来创建进程.本教程将讨论一些进程的管理方法. 你可以使用特殊变量 $$ 或 $PROCESS_ID 来获取进程 ID. %ENV 哈希存放了父进程, ...

  3. Android获取网络时间的方法

    一.通过免费或者收费的API接口获取 1.免费 QQ:http://cgi.im.qq.com/cgi-bin/cgi_svrtime 淘宝:http://api.m.taobao.com/rest/ ...

  4. ASP.NET Core MVC里面Razor如何获取URL参数

    原文:ASP.NET Core MVC里面Razor如何获取URL参数 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...

  5. vue.js对列表进行编辑未保存随时变更

    1.不要建立在同一vm对象下 2.使用深拷贝$.extend(true, vm.model, obj); 3.开新标签页

  6. O055、Detach Volume 操作

    参考https://www.cnblogs.com/CloudMan6/p/5636510.html     本节我们开始学习 Volume Detach 操作,就是将Volume从Instance上 ...

  7. java文件上传复制等功能

    package com.sitech.message.controller.task;import java.io.File;//引入类 import java.io.FileInputStream; ...

  8. Extjs中,Vo对象中的属性无法在data中获取的解决方法

    store.getById(data.data.id).raw.redpackid

  9. ASP.NET数据库连接类(SqlDBHelper)

    第一步:创建一个名为SqlDBHelper的类,用来作为联通数据库和系统之间的桥梁. 第二步:引入命名空间,如果System.Configuration.System.Transcations这两个命 ...

  10. (转)Android刷机的一些知识整理

    刷机概述刷机原因刷机可以升级和破解固件(在Android上:即可以升级系统,更改系统,获取Root权限):破解系统的原因①安装第三方软件不需要签名,不受证书的束缚:②修改系统的文件,达到系统的瘦身,以 ...