首先判断一下是否无解,并剔除孤立点。

根据best theorem,有向图中以$i$为起点的欧拉回路个数为:

以$i$为根的树形图个数$\times\prod_{i=1}^n (deg(i)-1)!$。

根据matrix tree theorem,以$i$为根的树形图个数$=$基尔霍夫矩阵去掉第$i$行第$i$列的行列式。

$ans=以1为起点的欧拉回路个数\times 1的度数$。

高斯消元即可,时间复杂度$O(n^3\log P)$。

#include<cstdio>
typedef long long ll;
const int N=110,M=200010,P=1000003;
int n,m,i,j,k,x,y,in[N],ou[N],vis[N],g[N][N];ll f[M],a[N][N],ans;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
void dfs(int x){
vis[x]=++m;
for(int i=1;i<=n;i++)if(g[x][i]&&!vis[i])dfs(i);
}
inline void swap(ll&a,ll&b){ll c=a;a=b;b=c;}
ll det(int n){
ll ans=1;bool flag=1;
for(i=1;i<=n;i++)for(j=1;j<=n;j++)a[i][j]=(a[i][j]%P+P)%P;
for(i=1;i<=n;i++){
for(j=i+1;j<=n;j++)while(a[j][i]){
ll t=a[i][i]/a[j][i];
for(k=i;k<=n;k++)a[i][k]=(a[i][k]+P-t*a[j][k]%P)%P;
for(k=i;k<=n;k++)swap(a[i][k],a[j][k]);
flag^=1;
}
ans=ans*a[i][i]%P;
if(!ans)return 0;
}
if(!flag)ans=P-ans;
return ans;
}
int solve(){
for(m=0,i=1;i<=n;i++)in[i]=ou[i]=vis[i]=0;
for(i=0;i<=n;i++)for(j=0;j<=n;j++)a[i][j]=g[i][j]=0;
int ed=0;
for(i=1;i<=n;i++)for(read(k);k--;g[i][j]++)read(j),ed++;
for(dfs(i=1);i<=n;i++)if(!vis[i]&&g[i])return 0;
for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(g[i][j]){
x=vis[i],y=vis[j];
ou[x]+=g[i][j];in[y]+=g[i][j];
a[x-1][y-1]-=g[i][j],a[x-1][x-1]+=g[i][j];
}
for(i=1;i<=m;i++)if(in[i]!=ou[i])return 0;
if(m==1)return f[g[1][1]];
ans=det(m-1)*in[1];
for(i=1;i<=m;i++)ans=ans*f[in[i]-1]%P;
return ans;
}
int main(){
for(f[0]=i=1;i<M;i++)f[i]=f[i-1]*i%P;
while(1){
read(n);
if(!n)return 0;
printf("%d\n",solve());
}
}

  

BZOJ3659 : Which Dreamed It的更多相关文章

  1. English trip V1 - 21. I dreamed dream Teacher:Corrine Key: past tense(过去式)

    In this lesson you will learn to describe an experience.  本课将会学习描述一次经历 课上内容(Lesson) 词汇(Key Word ) # ...

  2. 【BZOJ 3659】 3659: Which Dreamed It (Matrix-Tree&BEST theorem )

    3659: Which Dreamed It Time Limit: 20 Sec  Memory Limit: 1024 MBSubmit: 134  Solved: 41 Description ...

  3. English trip M1 - AC11 I Dreamed a Dream? 我做了一个梦 Teacher:Lamb

    In this lesson you will learn to describe an experience.  这节课你讲学习到描述经历 课上内容(Lesson) 词汇(Key Word ) 句型 ...

  4. Lesson 22 A glass envolops

    Text My daughter, Jane, never dreamed of receiving a letter from a girl of her own age in Holland. L ...

  5. python基础-文件操作

    一.文件操作 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r ,只读模式[默认模式,文件必须存在,不存在则抛出异 ...

  6. Python之路,Day3 - Python基础3

    一.文件操作 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  7. Python之路第一课Day3--随堂笔记(文件操作)

    一.集合的介绍 1.集合操作 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作 s = se ...

  8. Python之路第一课Day2--随堂笔记

    入门知识拾遗 一.bytes类型 bytes转二进制然后转回来 msg="张杨" print(msg) print(msg.encode("utf-8")) p ...

  9. 第一篇英文短文《It All Starts With A Dream》

    http://www.ximalaya.com/#/17209107/sound/6883165 Dreaming. Do you or don’t you? Do you dream about t ...

随机推荐

  1. 在Linux中安装JDK的步骤

    相信不少学习Java的朋友都在Windows操作系统中安装过JDK,这里就不对JDK做详细的介绍了. 在Windows下安装JDK可参考:JDK的安装和配置 1.下载JDK 我们可以去官网(http: ...

  2. perl检查变量是否定义

    my $label = defined($pieces[0]) ? $pieces[0] : ""; my @alreadyAddedCol = $node1->{DB}-& ...

  3. HTML5 – 4.canvas

    1.绘制矩形 2.绘制圆形 3.绘制文字 4.保存文件 什么是 Canvas? HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成. < ...

  4. 七牛:关于图片 EXIF 信息中旋转参数 Orientation 的理解

    EXIF(Exchangeable Image File)是 “可交换图像文件” 的缩写,当中包含了专门为数码相机的照片而定制的元数据,可以记录数码照片的拍摄参数.缩略图及其他属性信息,简单来说,Ex ...

  5. eclipse项目迁移到android studio(图文最新版)

    前言 最近Android studio(下文简称AS)官方发布了正式版,目前火得不行.个人认为主要是因为android是google自家的产品,AS也是他自己搞的IDE,以后的趋势android开发肯 ...

  6. Pyqt QComboBox 省市区县联动效果

    在Qt中, QComboBox方法窗口组件允许用户从列表清单中选择,在web中就是select标签,下拉选项. 省市区县的联动就是currentIndexChanged 获取当前的Index,通过这个 ...

  7. jQuery函数attr()和prop()的区别

    在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参数和用法也几乎完全相同. 但不得不说的是,这两个函数的用处却并不相同.下面我们来详细介绍这两个函数之间的区别. ...

  8. go sample - format

    go sample - format package mainimport "fmt"import "os"type point struct { x, y i ...

  9. Oracle【IT实验室】数据库备份与恢复之三:OS备份/用户管理的备份与恢复

    用户管理的备份与恢复也称 OS物理备份,是指通过数据库命令设置数据库为备份 状态,然后用操作系统命令,拷贝需要备份或恢复的文件.这种备份与恢复需要用户的 参与手工或自动完成. 对于使用 OS拷贝备份的 ...

  10. CodeIgniter类的使用

    Email 类 在配置文件中设置 Email 参数 如果您不想使用使用上述方法设定参数,您可以把它们放入一个配置文件.创建一个新文件称为email.php ,添加$config数组在该文件中.然后将该 ...