【BZOJ 3659】 3659: Which Dreamed It (Matrix-TreeBEST theorem )

2023-11-03 05:50

本文主要是介绍【BZOJ 3659】 3659: Which Dreamed It (Matrix-TreeBEST theorem ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3659: Which Dreamed It

Time Limit: 20 Sec  Memory Limit: 1024 MB
Submit: 134  Solved: 41

Description

有n个房间,每个房间有若干把钥匙能够打开特定房间的门。
你会做这么件事情:
最初你在房间1。
每当你到达一个房间,你可以选择该房间的一把钥匙,前往该钥匙对
应的房间,并将该钥匙丢到垃圾桶中。
你希望:最终回到房间1,且垃圾桶中有所有的钥匙。
求方案数。两组方案不同,当且仅当使用钥匙的顺序不同。注意,每
把钥匙都是不同的。

Input

有多组数据。
对于每组数据第一行输入一个数n,表示房间数。
接下来n行依次描述每个房间:
首先一个数s,表示这个房间的钥匙数目,接下来s个数,分别描述每把
钥匙能够打开的房间的门。
输入以n-0结尾。

Output

对于每组数据,输出方案数,为了方便你的输出,请将答案对1000003取模。

Sample Input

1
0
2
1 1
1 2
0

Sample Output

1
0

HINT

在第一组样例中,没有钥匙,则方案数为1。

在第二组样例中,你不可能使用第二个房间的钥匙,所以方案数为0。







房间数小于等于100,钥匙数小于等于200000。

数据组数也不是特别多。

Source

 

 

【分析】

  这种题叫做结论题。

  %CA爷

  然后这里有两个结论 
  1.有向图以i为根的树形图的数目=基尔霍夫矩阵去掉第i行和第i列的主子式的行列式的值(即Matrix-Tree定理不仅适用于求无向图生成树数目,也适用于求有向图树形图数目) 
  2.以某个点为起点的欧拉回路数=该点为根的树形图数*(所有点出度-1)的乘积(本名BEST theorem) 
  关于BEST theorem可以提供一个wiki上的讲解:about BEST theorem 

 

  最后还有乘上起点的出度?【怎么没说。。

 

【我觉得我Mod那里应该有问题,但是我没有被卡哦。。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define LL long long
 8 const int Mod=1000003;
 9 #define Maxn 1000010
10 
11 int a[110][110],m[110],fac[Maxn];
12 
13 int qpow(int x,int b)
14 {
15     x%=Mod;
16     int ans=1;
17     while(b)
18     {
19         if(b&1) ans=1LL*ans*x%Mod;
20         x=1LL*x*x%Mod;
21         b>>=1;
22     }
23     return ans;
24 }
25 
26 int gauss(int n)
27 {
28     if (n==0) return 1;
29     int ans=1;
30     for(int i=1;i<=n;i++)
31     {
32         int t=i;
33         for(int j=i+1;j<=n;j++) if(a[j][i]>a[t][i]) t=j;
34         if(a[t][i]==0) return 0;
35         if(t!=i)
36         {
37             ans=-ans;
38             for(int j=1;j<=n;j++) swap(a[t][j],a[i][j]);
39         }
40         int ny=qpow(a[i][i],Mod-2);
41         for(int j=i+1;j<=n;j++)
42         {
43             int nw=1LL*ny*a[j][i]%Mod;
44             for(int k=i;k<=n;k++) a[j][k]-=1LL*a[i][k]*nw%Mod,a[j][k]=(a[j][k]%Mod+Mod)%Mod;
45         }
46     }
47     for(int i=1;i<=n;i++) ans=1LL*ans*a[i][i]%Mod;
48     ans=(ans%Mod+Mod)%Mod;
49     return ans;
50 }
51 
52 int main()
53 {
54     int n;
55     fac[0]=1;for(int i=1;i<=Mod;i++) fac[i]=1LL*fac[i-1]*i%Mod;
56     while(1)
57     {
58         scanf("%d",&n);
59         if(!n) break;
60         memset(a,0,sizeof(a));
61         for(int i=1;i<=n;i++)
62         {
63             scanf("%d",&m[i]);
64             for(int j=1;j<=m[i];j++)
65             {
66                 int x;
67                 scanf("%d",&x);
68                 if(i!=x) a[i][x]--,a[i][i]++;
69             }
70         }
71         if(n==1&&!m[1]) {printf("1\n");continue;}
72         int ans=1;
73         for(int i=1;i<=n;i++) ans=1LL*ans*fac[m[i]-1]%Mod;
74         ans=1LL*ans*m[1]%Mod;
75         ans=1LL*ans*gauss(n-1)%Mod;
76         printf("%d\n",ans);
77     }
78     return 0;
79 }
View Code

 

2017-04-16 20:11:07

转载于:https://www.cnblogs.com/Konjakmoyu/p/6719773.html

这篇关于【BZOJ 3659】 3659: Which Dreamed It (Matrix-TreeBEST theorem )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/336032

相关文章

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

73. Set Matrix Zeros

题目: 解答: 提供了两种解题思路: 第一种,使用两个数组,分别标记每一行、每一列是否有0的存在,然后再去更新二维数组。 第二种,使用两个变量brow,bcol分别标记第0行,第0列是否存在0,然后使用每一行、每一列的第一个单元存储是否该行、该列存在0. 代码: class Solution {public:// 方法一void setZeroes(vector<vector<i

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

python 实现matrix exponentiation矩阵求幂算法

matrix exponentiation矩阵求幂算法介绍 矩阵求幂算法(Matrix Exponentiation)是一种通过利用矩阵乘法的结合律来高效地计算矩阵的幂的算法。这种方法特别适用于在算法竞赛和计算机科学领域中解决需要快速计算矩阵幂的问题,如求解线性递推关系、图论中的路径计数等。 基本思想 矩阵求幂算法的基本思想类似于整数快速幂算法(快速幂算法),通过递归或迭代的方式将矩阵幂的计

[LeetCode] 240. Search a 2D Matrix II

题:https://leetcode.com/problems/search-a-2d-matrix-ii/description/ 题目 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers i

[LeetCode] 566. Reshape the Matrix

题:https://leetcode.com/problems/reshape-the-matrix/description/ 题目 In MATLAB, there is a very useful function called ‘reshape’, which can reshape a matrix into a new one with different size but keep

UVa 11992 Fast Matrix Operations 线段树

UVa 11992 Fast Matrix Operations 题目大意:有一个r行c列的全0矩阵,支持三种操作: 1 x1 y1 x2 y2 v 子矩阵(x1,y1,x2,y2)的所有元素增加v(v > 0)。 2 x1 y1 x2 y2 v 子矩阵(x1,y1,x2,y2)的所有元素设为v(v > 0)。 3 x1 y1 x2 y2    查询子矩阵(x1,y1,x2,y2

【HDU】4965 Fast Matrix Calculation 矩阵快速幂

传送门:【HDU】4965 Fast Matrix Calculation 题目分析:因为比赛的时候写的太匆忙。。写的不堪入目,所以赛后重写了一次,顺便就贴一下了。 因为A*B=C,所以C^(N*N-1) = A*B*A*B*A*...*B*A*B,因为满足结合律所以变成A*( (B*A)^(N*N-2) )*B,因为中间得到的矩阵最大不超过K(K<=6),所以可以对中间的矩阵快速幂,然

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,