Description

四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖
怪涌入了幻想乡,扰乱了幻想乡昔日的秩序。但是幻想乡的建制派妖怪(人类)
博丽灵梦和八云紫等人整日高谈所有妖怪平等,幻想乡多元化等等,对于幻想乡
目前面临的种种大问题却给不出合适的解决方案。
风间幽香是幻想乡里少有的意识到了问题的严重性的大妖怪。她这次勇敢的
站了出来参加幻想乡大选。提出包括在幻想乡边境建墙(并让人类出钱),大力
开展基础设施建设挽回失业率等一系列方案,成为了大选年出人意料的黑马并顺
利的当上了幻想乡的大统领。
幽香上台以后,第一项措施就是要修建幻想乡的公路。幻想乡有 N 个城市,
之间原来没有任何路。幽香向选民承诺要减税,所以她打算只修 N- 1 条路将
这些城市连接起来。但是幻想乡有正好 N- 1 个建筑公司,每个建筑公司都想
在修路的过程中获得一些好处。
虽然这些建筑公司在选举前没有给幽香钱,幽香还是打算和他们搞好关系,
因为她还指望他们帮她建墙。所以她打算让每个建筑公司都负责一条路来修。
每个建筑公司都告诉了幽香自己有能力负责修建的路是哪些城市之间的。所
以幽香打算选择 N-1 条能够连接幻想乡所有城市的边,然后每条边都交给一
个能够负责该边的建筑公司修建,并且每个建筑公司都恰好修一条边。
幽香现在想要知道一共有多少种可能的方案呢?两个方案不同当且仅当它
们要么修的边的集合不同,要么边的分配方式不同。

Input

第一行包含一个正整数 N(N<=17), 表示城市个数。
接下来 N-1 行,其中第 i行表示第 i个建筑公司可以修建的路的列表:
以一个非负数mi 开头,表示其可以修建 mi 条路,接下来有mi 对数,
每对数表示一条边的两个端点。其中不会出现重复的边,也不会出现自环。

Output

仅一行一个整数,表示所有可能的方案数对 10^9 + 7 取模的结果。
 

Sample Input

4
2 3 2 4 2
5 2 1 3 1 3 2 4 1 4 3
4 2 1 3 2 4 1 4 2

Sample Output

17
 
和ZJOI小星星很像啊。
考虑容斥原理,设A(x)表示x公司参与修建的方案集合,那么答案等价于求|A(1)∩A(2)∩……∩A(n)|,容斥转化成并集形式,然后用MatrixTree定理计算即可。
实际复杂度为O(N^3*2^N)。
  1. #include<cstdio>
  2. #include<cctype>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define rep(i,s,t) for(int i=s;i<=t;i++)
  6. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  7. #define ren for(int i=first[x];i;i=next[i])
  8. using namespace std;
  9. const int BufferSize=1<<16;
  10. char buffer[BufferSize],*head,*tail;
  11. inline char Getchar() {
  12. if(head==tail) {
  13. int l=fread(buffer,1,BufferSize,stdin);
  14. tail=(head=buffer)+l;
  15. }
  16. return *head++;
  17. }
  18. inline int read() {
  19. int x=0,f=1;char c=Getchar();
  20. for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
  21. for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
  22. return x*f;
  23. }
  24. typedef long long ll;
  25. const int maxn=20;
  26. const int mod=1000000007;
  27. typedef ll Matrix[maxn][maxn];
  28. void gcd(ll a,ll b,ll& x,ll& y) {
  29. if(!b) x=1,y=0;
  30. else gcd(b,a%b,y,x),y-=x*(a/b);
  31. }
  32. ll getinv(ll a) {
  33. ll b=mod,x,y;gcd(a,b,x,y);
  34. return (x+mod)%mod;
  35. }
  36. Matrix B;
  37. ll gauss(Matrix A,int n) {
  38. ll ans=1;
  39. rep(i,0,n-1) {
  40. int r=i;
  41. rep(j,i+1,n-1) if(abs(A[r][i])<abs(A[j][i])) r=j;
  42. if(r!=i) ans*=-1,swap(A[r],A[i]);
  43. ll inv=getinv(A[i][i]);
  44. rep(k,0,n-1) if(i!=k)
  45. dwn(j,n-1,i) A[k][j]=(A[k][j]-A[k][i]*A[i][j]%mod*inv%mod+mod)%mod;
  46. }
  47. rep(i,0,n-1) (ans*=A[i][i])%=mod;
  48. return (ans+mod)%mod;
  49. }
  50. struct Company {
  51. int m,u[maxn*maxn],v[maxn*maxn];
  52. }A[maxn];
  53. int main() {
  54. int n=read();
  55. rep(i,0,n-2) dwn(j,A[i].m=read(),1) A[i].u[j]=read(),A[i].v[j]=read();
  56. ll ans=0;
  57. rep(S,0,(1<<n-1)-1) {
  58. int cnt=0;
  59. rep(i,0,n-1) rep(j,0,n-1) B[i][j]=0;
  60. rep(i,0,n-2) if(S>>i&1) {
  61. cnt++;
  62. rep(j,1,A[i].m) {
  63. int u=A[i].u[j]-1,v=A[i].v[j]-1;
  64. B[u][u]++;B[v][v]++;B[u][v]--;B[v][u]--;
  65. }
  66. }
  67. rep(i,0,n-1) rep(j,0,n-1) (B[i][j]+=mod)%=mod;
  68. if(n-1-cnt&1) (ans-=gauss(B,n-1))%=mod;
  69. else (ans+=gauss(B,n-1))%=mod;
  70. }
  71. printf("%lld\n",(ans+mod)%mod);
  72. return 0;
  73. }

  

BZOJ4596: [Shoi2016]黑暗前的幻想乡的更多相关文章

  1. bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 464  Solved: 264[Submit][Sta ...

  2. 【BZOJ4596】[Shoi2016]黑暗前的幻想乡 容斥+矩阵树定理

    [BZOJ4596][Shoi2016]黑暗前的幻想乡 Description 幽香上台以后,第一项措施就是要修建幻想乡的公路.幻想乡有 N 个城市,之间原来没有任何路.幽香向选民承诺要减税,所以她打 ...

  3. bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥)

    bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥) bzoj Luogu 题解时间 看一看数据范围,求生成树个数毫无疑问直接上矩阵树定理. 但是要求每条边都 ...

  4. bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 559  Solved: 325[Submit][Sta ...

  5. [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)

    这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...

  6. P4336 [SHOI2016]黑暗前的幻想乡

    P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理(高斯消元+乘法逆元)+容斥 ans=总方案数 -(公司1未参加方案数 ∪ 公司2未参加方案数 ∪ 公司3未参加方案数 ∪ ...... ∪ ...

  7. 【BZOJ4596】黑暗前的幻想乡(矩阵树定理,容斥)

    [BZOJ4596]黑暗前的幻想乡(矩阵树定理,容斥) 题面 BZOJ 有\(n\)个点,要求连出一棵生成树, 指定了一些边可以染成某种颜色,一共\(n-1\)种颜色, 求所有颜色都出现过的生成树方案 ...

  8. 【BZOJ 4596】 4596: [Shoi2016]黑暗前的幻想乡 (容斥原理+矩阵树定理)

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 324  Solved: 187 Description ...

  9. BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4596 https://www.luogu.org/problemnew/show/P4336#su ...

随机推荐

  1. PHP 文件夹操作「复制、删除、查看大小」递归实现

    PHP虽然提供了 filesize.copy.unlink 等文件操作的函数,但是没有提供 dirsize.copydir.rmdirs 等文件夹操作的函数(rmdir也只能删除空目录).所以只能手动 ...

  2. BZOJ 2081: [Poi2010]Beads

    Description 问把n截成每个长度后不同子串个数. Sol 调和极数+Hash. 首先这是一个式子 \(n\sum_{i=1}^n \frac {1}{i}\) . 这东西就是调和极数再乘上 ...

  3. java动态调用webservice

    cxf方式 public static Object[] invokeRemoteMethod(String url, String method, Object[] parameters) { Ja ...

  4. Apple Pay 初探

    Apple Pay 一.概述 1.支付方式:Touch ID/ Passcode 2.设备要求:iPhone6以上(iphone:线上/线下 ipad:线上 watch:线下) 3.系统要求:iOS8 ...

  5. JS学习进阶中 come on!

    1,定义新的属性来扩展对象 新方法:defineProperty() 实例: var data = {}: Object.defineProperty(data,"type",{ ...

  6. MysqlNDB集群配置

    为了避免不必要的资源分配,默认情况下是不启动ndbcluster引擎.

  7. swift之inout

    在swift中,我们常常对数据进行一些处理.因为swift的计算属性,所以如果不是大量重复性处理,基本可以在set及didSet中改变原数据的一些状态.但需要用到同样的算法处理大量数据的时候,仍然需要 ...

  8. HTML入门教程 这里可以免费学习啦

    本文目标 30分钟内让你明白HTML是什么,并对它有一些基本的了解.一旦入门后,你可以从网上找到更多更详细的资料来继续学习. 什么是HTML HTML是英文Hyper Text Mark-up Lan ...

  9. Android Studio 关联源码问题

    Android Studio 点击某个类查看源码有时候会出现如下情况  这种情况并不是每个项目都会出现这种情况,那是因为项目的编译版本不同,有的关联了Sources中的源码,而有的没有. 下面说一下具 ...

  10. Python爬虫进阶二之PySpider框架安装配置

    关于 首先,在此附上项目的地址,以及官方文档 PySpider 官方文档 安装 1. pip 首先确保你已经安装了pip,若没有安装,请参照 pip安装 2. phantomjs PhantomJS ...