把集合看成左边的点,图中的点看成右边的点,若集合$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. FarBox--另类有趣的网站服务【转】

    FarBox--另类有趣的网站服务 转自:http://mosir.org/html/y2012/the-interesting-web-service-serve-by-FarBox.html 作者 ...

  2. Win10 + VS2017 15.5.6 环境下解决 Python 3.6 环境无法刷新DB的问题

    作为宇宙第一IDE,VS2017对Python的支持还算可以,虽然和PyCharm等Python专用IDE相比还有些差距,但是经过后续的更新升级,我相信VS2017将越来越完善.由于本人一直都是使用V ...

  3. linux系统下安装redis及配置

    下载Redis redis-3.2.11.tar.gz 解压编译 tar xzf redis-3.2.11.tar.gz cd redis-3.2.11 make 编译完成之后,可以看到解压文件red ...

  4. centos中selinux功能及常用服务配置

    SELinux: Secure Enhenced Linux 常用命令 获取selinux的当前状态: # getenforce 临时启用或禁用: # setenfoce 0|1 永久性启用,需要修改 ...

  5. 解决报错SAXNotRecognizedException: Feature 'http://javax.xml.XMLConstants/feature/secure-processing' not recognized

    今天调试appium脚本,发现运行脚本就报错 SAXNotRecognizedException: Feature 'http://javax.xml.XMLConstants/feature/sec ...

  6. vue系列之webpack

    webpack 地址: https://github.com/vuejs-templates/webpack 注意里面的template,用webpack创建的项目,结构就是这样的

  7. CCF2014032窗口(C语言)

    问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域.窗口的边界上的点也属于该窗口.窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的 ...

  8. iOS学习笔记之UITableViewController&UITableView

    iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论 ...

  9. 配置CenOS网络,并用Xshell链接。

    首先输入 cd /etc/sysconf ig/network-scripts/ 然后回车 输入ls 然后回车 输入 vi ifcfg-eth0  然后回车 按下esc键,然先后按下U,I键把光标用键 ...

  10. 《剑指offer》-旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...