把集合看成左边的点,图中的点看成右边的点,若集合$i$不包含$j$,则连边$i->j$,得到一个二分图,等价于求这个二分图的完备匹配个数。

设$f[i][j]$表示考虑了前$i$个集合,匹配了$j$个集合的方案数。

转移则是枚举当前集合是否匹配,然后设$g[i][j]$表示考虑了前$i$个内部点,匹配了$j$个集合的方案数。

最后方案数再除以每种集合出现次数的阶乘即可。

时间复杂度$O(n^2)$。

#include<cstdio>
#include<algorithm>
const int N=1010,P=1000000007;
int T,n,i,j,k,x,a[N],s[N],v[N],f[N][N],g[N][N],inv[N];unsigned long long h[N],w[N];
inline void up(int&a,int b){a+=b;if(a>=P)a-=P;}
int solve(){
for(i=1;i<=n;i++)v[i]=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]),s[i]=s[i-1]+a[i];
for(w[i]=j=0;j<a[i];j++)scanf("%d",&x),w[i]^=h[x],v[x]++;
}
for(i=1;i<=n;i++)if(v[i]!=1)return 0;
std::sort(w+1,w+n+1);
for(f[1][0]=i=1;i<=n;i=j){
for(j=i;j<=n&&w[i]==w[j];j++);
f[1][0]=1LL*f[1][0]*inv[j-i]%P;
}
for(i=2;i<=n;i++){
for(j=0;j<=i;j++)g[0][j]=f[i-1][j];
for(j=1;j<=a[i];j++)for(k=0;k<=i;k++)g[j][k]=0;
for(j=1;j<=a[i];j++)for(k=0;k<=i;k++)if(g[j-1][k]){
if(k<i)up(g[j][k+1],1LL*g[j-1][k]*(i-1-k)%P);
up(g[j][k],g[j-1][k]);
}
for(j=0;j<=i;j++)f[i][j]=g[a[i]][j],g[0][j]=1LL*f[i-1][j]*(s[i-1]-j)%P;
for(j=1;j<=a[i];j++)for(k=0;k<=i;k++)g[j][k]=0;
for(j=1;j<=a[i];j++)for(k=0;k<=i;k++)if(g[j-1][k]){
if(k<i)up(g[j][k+1],1LL*g[j-1][k]*(i-1-k)%P);
up(g[j][k],g[j-1][k]);
}
for(j=1;j<=i;j++)up(f[i][j],g[a[i]][j-1]);
}
return f[n][n];
}
int main(){
for(i=1;i<N;i++)h[i]=h[i-1]*233+17;
for(inv[0]=inv[1]=1,i=2;i<N;i++)inv[i]=1LL*(P-inv[P%i])*(P/i)%P;
for(i=1;i<N;i++)inv[i]=1LL*inv[i]*inv[i-1]%P;
while(~scanf("%d",&n)){
if(!n)return 0;
printf("Case #%d: %d\n",++T,solve());
}
}

  

BZOJ3861 : Tree的更多相关文章

  1. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  2. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  3. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  4. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  5. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  6. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  7. Leetcode 笔记 99 - Recover Binary Search Tree

    题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...

  8. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  9. Leetcode 笔记 101 - Symmetric Tree

    题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...

随机推荐

  1. 如何交叉编译 linux kernel 内核

    Compilation We first need to move the config file by running cp arch/arm/configs/bcmrpi_cutdown_defc ...

  2. ulimit -n 修改

    Linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值.那么应该在哪里设置呢? [root@loca ...

  3. Bootstrap3.0学习第二轮(栅格系统原理)

    详情请查看 http://aehyok.com/Blog/Detail/8.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  4. unbuntu 16.04.2 安装 Eclipse C++开发环境

    1.安装JAVA (1)首先添加源: sudo gedit /etc/apt/sources.list 在打开的文件中添加如下内容并保存: deb http://ppa.launchpad.net/w ...

  5. Jenkins中配置selenium测试

    Jenkins中配置selenium测试 2015/03/23 第一步在jenkins中配置selenium服务器 第二步工程配置: 第三步:执行构建: 第四步,查看报告:

  6. zabbix3.0.4关于java服务端程序内存溢出的处理

    关于java服务端程序内存溢出的处理 java服务端程序内存溢出会产生jvm.log文件,此时程序会挂掉,无法正常处理业务,需要重启服务 思路: 当存在jvm.log这个文件的时候则触发clean_j ...

  7. zabbix系列(一)centos7搭建zabbix3.0.4服务端及配置详解

    1.安装常用的工具软件 yum install -y vim wget centos7关闭防火墙 systemctl stop firewalld.service systemctl disable ...

  8. centos中进程管理工具

    进程管理:  二进制的格式为ELF,是CPU指令集中的指令  程序=指令+数据,  进程是程序的副本,可以有多个  内核是一个资源调度监视器  Linux是抢占式多任务  内存被事先划分成多个相同大小 ...

  9. body-parser Node.js(Express) HTTP请求体解析中间件

    body-parser Node.js(Express) HTTP请求体解析中间件 2016年06月08日     781     声明 在HTTP请求中,POST.PUT和PATCH三种请求方法中包 ...

  10. hdu4578线段树区间更新

    /* 只有在区间中的数字不相同时才pushdown:往子区间传递数字再到子区间更新,同时该区间的flag置0 更新完左右子区间后进行pushup,如果左右子区间数字相同,那么把子区间合并,子区间数字置 ...