【BZOJ 3659】 3659: Which Dreamed It (Matrix-Tree&BEST theorem )
3659: Which Dreamed It
Time Limit: 20 Sec Memory Limit: 1024 MB
Submit: 134 Solved: 41Description
有n个房间,每个房间有若干把钥匙能够打开特定房间的门。你会做这么件事情:最初你在房间1。每当你到达一个房间,你可以选择该房间的一把钥匙,前往该钥匙对应的房间,并将该钥匙丢到垃圾桶中。你希望:最终回到房间1,且垃圾桶中有所有的钥匙。求方案数。两组方案不同,当且仅当使用钥匙的顺序不同。注意,每把钥匙都是不同的。Input
有多组数据。对于每组数据第一行输入一个数n,表示房间数。接下来n行依次描述每个房间:首先一个数s,表示这个房间的钥匙数目,接下来s个数,分别描述每把钥匙能够打开的房间的门。输入以n-0结尾。Output
对于每组数据,输出方案数,为了方便你的输出,请将答案对1000003取模。Sample Input
1
0
2
1 1
1 2
0Sample Output
1
0HINT
在第一组样例中,没有钥匙,则方案数为1。
在第二组样例中,你不可能使用第二个房间的钥匙,所以方案数为0。
房间数小于等于100,钥匙数小于等于200000。
数据组数也不是特别多。
Source
【分析】
这种题叫做结论题。
%CA爷
然后这里有两个结论
1.有向图以i为根的树形图的数目=基尔霍夫矩阵去掉第i行和第i列的主子式的行列式的值(即Matrix-Tree定理不仅适用于求无向图生成树数目,也适用于求有向图树形图数目)
2.以某个点为起点的欧拉回路数=该点为根的树形图数*(所有点出度-1)的乘积(本名BEST theorem)
关于BEST theorem可以提供一个wiki上的讲解:about BEST theorem
最后还有乘上起点的出度?【怎么没说。。
【我觉得我Mod那里应该有问题,但是我没有被卡哦。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
const int Mod=;
#define Maxn 1000010 int a[][],m[],fac[Maxn]; int qpow(int x,int b)
{
x%=Mod;
int ans=;
while(b)
{
if(b&) ans=1LL*ans*x%Mod;
x=1LL*x*x%Mod;
b>>=;
}
return ans;
} int gauss(int n)
{
if (n==) return ;
int ans=;
for(int i=;i<=n;i++)
{
int t=i;
for(int j=i+;j<=n;j++) if(a[j][i]>a[t][i]) t=j;
if(a[t][i]==) return ;
if(t!=i)
{
ans=-ans;
for(int j=;j<=n;j++) swap(a[t][j],a[i][j]);
}
int ny=qpow(a[i][i],Mod-);
for(int j=i+;j<=n;j++)
{
int nw=1LL*ny*a[j][i]%Mod;
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;
}
}
for(int i=;i<=n;i++) ans=1LL*ans*a[i][i]%Mod;
ans=(ans%Mod+Mod)%Mod;
return ans;
} int main()
{
int n;
fac[]=;for(int i=;i<=Mod;i++) fac[i]=1LL*fac[i-]*i%Mod;
while()
{
scanf("%d",&n);
if(!n) break;
memset(a,,sizeof(a));
for(int i=;i<=n;i++)
{
scanf("%d",&m[i]);
for(int j=;j<=m[i];j++)
{
int x;
scanf("%d",&x);
if(i!=x) a[i][x]--,a[i][i]++;
}
}
if(n==&&!m[]) {printf("1\n");continue;}
int ans=;
for(int i=;i<=n;i++) ans=1LL*ans*fac[m[i]-]%Mod;
ans=1LL*ans*m[]%Mod;
ans=1LL*ans*gauss(n-)%Mod;
printf("%d\n",ans);
}
return ;
}
2017-04-16 20:11:07
【BZOJ 3659】 3659: Which Dreamed It (Matrix-Tree&BEST theorem )的更多相关文章
- 【BZOJ 2119】 2119: 股市的预测 (后缀数组+分块+RMQ)
2119: 股市的预测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 404 Solved: 188 Description 墨墨的妈妈热爱炒股,她 ...
- 【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)
1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...
- 【BZOJ 1016】 1016: [JSOI2008]最小生成树计数 (DFS|矩阵树定理)
1016: [JSOI2008]最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树 ...
- 【BZOJ 1095】 1095: [ZJOI2007]Hide 捉迷藏 (括号序列+线段树)
1095: [ZJOI2007]Hide 捉迷藏 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏 ...
- 【bzoj 2716】[Violet 3]天使玩偶 (CDQ+树状数组)
题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的 ...
- 【noi 2.6_9280】&【bzoj 1089】严格n元树(DP+高精度+重载运算符)
题意:定义一棵树的所有非叶节点都恰好有n个儿子为严格n元树.问深度为d的严格n元树数目. 解法:f[i]表示深度为<=i的严格n元树数目.f[i]-f[i-1]表示深度为i的严格n元树数目.f[ ...
- 【UOJ207】共价大爷游长沙(Link-Cut Tree,随机化)
[UOJ207]共价大爷游长沙(Link-Cut Tree,随机化) 题面 UOJ 题解 这题太神了 \(\%\%\%myy\) 看到动态的维护边很容易的想到了\(LCT\) 然后能否堵住一条路 我们 ...
- 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...
- 【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3601 Solved: 1322 Descrip ...
随机推荐
- 无废话JavaScript(上)
<程序员>2008.09期有一篇名为<无废话ErLang>的文章,这让我想到了许多的诸如“无废话C”.“无废话书评”这类的文章,也想到了JavaScript可没有一篇“无废话” ...
- 新手应知道的ASP.NET代码编写规范
1.局部变量的名称要有意义,尽量用对应的英文命名,比如“用户姓名”变量,不要用aa bb cc等来命名,而要使用userName. 2.不要使用单个字母的变量,如i.n.x等.而要使用index.te ...
- laravel 模糊查询
模糊查询: Model::where('field_name','like','%'.$keywords.'%')->get() 转载:http://wenda.golaravel.com/qu ...
- Spring Boot工程结构推荐
工程结构(最佳实践) Spring Boot框架本身并没有对工程结构有特别的要求,但是按照最佳实践的工程结构可以帮助我们减少可能会遇见的坑,尤其是Spring包扫描机制的存在,如果您使用最佳实践的工程 ...
- APP爬虫之Appium使用
一.安装环境 Appium安装(windows版) 一.安装node.js 1.到官网下载node.js:https://nodejs.org/en/download/ 2.获取到安装文件后,直接双击 ...
- jQuery domready
在jQuery里面,我们可以看到两种写法: $(function(){ //todo }) $(document).ready(function(){ //todo }) 这两个方法的效果都是一样的, ...
- 线程句柄和线程ID的区别
●CreateThread() API 用于创建线程. API 返回同时线程句柄,并通过参数得到线程标识符 (ID). 线程句柄有完全访问权创建线程对象. 运行线程时线程 ID 唯一标识线程在系统级别 ...
- C++ STL标准入门
C++:STL标准入门汇总 第一部分:(参考百度百科) 一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexand ...
- 64_p6
polkit-kde-5.10.1-1.fc26.x86_64.rpm 12-Jun-2017 13:45 84854 polkit-libs-0.113-8.fc26.i686.rpm 13-Apr ...
- java处理金证中登查询图片二进制流问题
package com.szkingdom.kess.model; import java.io.File; import java.io.FileOutputStream; import java. ...