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那里应该有问题,但是我没有被卡哦。。

 #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 )的更多相关文章

  1. 【BZOJ 2119】 2119: 股市的预测 (后缀数组+分块+RMQ)

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 404  Solved: 188 Description 墨墨的妈妈热爱炒股,她 ...

  2. 【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)

    1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...

  3. 【BZOJ 1016】 1016: [JSOI2008]最小生成树计数 (DFS|矩阵树定理)

    1016: [JSOI2008]最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树 ...

  4. 【BZOJ 1095】 1095: [ZJOI2007]Hide 捉迷藏 (括号序列+线段树)

    1095: [ZJOI2007]Hide 捉迷藏 Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏 ...

  5. 【bzoj 2716】[Violet 3]天使玩偶 (CDQ+树状数组)

    题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的 ...

  6. 【noi 2.6_9280】&【bzoj 1089】严格n元树(DP+高精度+重载运算符)

    题意:定义一棵树的所有非叶节点都恰好有n个儿子为严格n元树.问深度为d的严格n元树数目. 解法:f[i]表示深度为<=i的严格n元树数目.f[i]-f[i-1]表示深度为i的严格n元树数目.f[ ...

  7. 【UOJ207】共价大爷游长沙(Link-Cut Tree,随机化)

    [UOJ207]共价大爷游长沙(Link-Cut Tree,随机化) 题面 UOJ 题解 这题太神了 \(\%\%\%myy\) 看到动态的维护边很容易的想到了\(LCT\) 然后能否堵住一条路 我们 ...

  8. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

    [POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  9. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...

  10. 【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3601  Solved: 1322 Descrip ...

随机推荐

  1. ④ 设计模式的艺术-04.抽象工厂(Abstract Factory)模式

    抽象工厂模式 用来生产不同产品族的全部产品.(对于增加新的产品,无能为力:支持增加产品族) 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种.业务分类时,通过抽象工厂模式产生需要的对象是一种非常 ...

  2. LintCode 373: Partition Array

    LintCode 373: Partition Array 题目描述 分割一个整数数组,使得奇数在前偶数在后. 样例 给定[1, 2, 3, 4],返回[1, 3, 2, 4]. Thu Feb 23 ...

  3. 快速入门react

    安装react npm install creat-react-app -g这里直接安装react的一个脚手架,里面包含了要用到的许多东西,帮助快速入门react 创建新项目 create-react ...

  4. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

  5. 【洛谷 P4437】 [HNOI/AHOI2018]排列(贪心,堆)

    题目链接 如果\(j<=k,a_{p[j]}!=p[k]\)可以理解为如果\(a_{p[j]}=p[k]\),那么\(k\)一定要放在\(j\)前面,也就是\(a_j\)在\(j\)前面. 于是 ...

  6. node的简单爬虫

    最近在学node,这里简单记录一下. 首先是在linux的环境下,关于node的安装教程:   https://github.com/alsotang/node-lessons/tree/master ...

  7. Linux下文本浏览器lynx

    一般登录到Linux上的时候都是使用Shell登录上去的,但是如果这个时候我们有浏览网页的需求怎么办,比如我刚刚部署上去一个网站,但是我并不知道我有没有部署成功,而且只能在这一台Linux上能够访问到 ...

  8. Oracle笔记之表空间

    Oracle中有一个表空间的概念,一个数据库可以有好几个表空间,表放在表空间下. 1. 创建表空间 创建表空间使用create tablespace命令: CREATE TABLESPACE foo_ ...

  9. PHP文本式留言板——php经典实例

    文件结构: index.php 主页和添加页 show.php 查看留言页 ly.db 文本保存页 doAdd.php 添加功能页 doDel.php 删除功能页  index.php <htm ...

  10. JS 判断手机操作系统代码

    还是利用UA, 返回值: ios, android, unknown function getMobileType () { var ua = window.navigator.userAgent.t ...