4596: [Shoi2016]黑暗前的幻想乡

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 464  Solved: 264
[Submit][Status][Discuss]

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

HINT

Source

By 佚名上传

这个题有点神
题目规定每个公司都必须修一条,所以我们考虑容斥,和它对着干
强行规定某些公司不修  ans=全都要修-至少一个不修+至少2个不修...
然后考虑排除一些公司不修之后的方案
无向图求生成树个数?被基尔霍夫支配的恐惧逐渐涌上心头。
对啦!基尔霍夫矩阵可以求。具体就是构造基尔霍夫矩阵,
然后去掉任意一行一列(行列标号相同)再对矩阵求行列式值。

从ZJ那里get到一些新东西:
求行列式的值可以把基尔霍夫矩阵高斯消元,保留上三角或者下三角然后对角线求积即可得出答案

然后我就滚去写了,,但是写的时候遇到一些问题:消元时double精度怎么办啊?取模怎么办啊?

从ZJ那里get到一些新东西:
欧几里得求解高斯消元。。O(n^3*log2(n))
具体是:在消元消到第i行时,把i+1~n行的i列位置都消成0
怎么消呢?
先知道行列式性质:
1.任意两行交换位置,行列式值变相反数
2.一行加上其他任意一行的整数倍,行列式值不变

考虑欧几里得把a[j][i]消成0:
把i行和j行辗转相除再相减直到a[j][i]为0啊,,
具体就是参照求gcd的做法啦,
先减,a[j][k]-=(a[i][i]/a[j][i])*a[i][k] (n>=k>=i)
再交换i,j行直到a[j][i]为0

参考一篇论文 https://wenku.baidu.com/view/d5e0e018964bcf84b9d57ba8.html

ZJ的此篇博客 http://www.cnblogs.com/zj75211/p/8035125.html

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define ll long long
#define N 25
#define mod 1000000007
using namespace std;
int n,m,cnt[N];ll a[N][N];
struct edge{int u,v;};
vector<edge>g[N]; ll gauss(int x){
int fg=1;
for(int i=1;i<=x;i++)
for(int j=i+1;j<=x;j++)
while(a[j][i]!=0){
ll t=a[i][i]/a[j][i];
for(int k=i;k<=x;k++)
a[i][k]=(a[i][k]-a[j][k]*t)%mod;
for(int k=i;k<=x;k++)
swap(a[i][k],a[j][k]);
fg=-fg;
}
ll res=fg;
for(int i=1;i<=x;i++)res=res*a[i][i]%mod;
if(res<0)res+=mod;
return res;
} void build(int st){
memset(a,0,sizeof(a));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<n;i++){
if(!(st&(1<<(i-1))))continue;
for(int j=0;j<g[i].size();j++){
edge x=g[i][j];
a[x.u][x.v]--;a[x.v][x.u]--;
cnt[x.u]++;cnt[x.v]++;
}
}
for(int i=1;i<=n;i++)a[i][i]=cnt[i];
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d",&m);
while(m--){
int a,b;
scanf("%d%d",&a,&b);
g[i].push_back((edge){a,b});
}
}
ll ans=0;
for(int st=0;st<(1<<(n-1));st++){
int sum=0;
for(int i=0;i<n-1;i++)if(st&(1<<i))sum++;
build(st);ll x=gauss(n-1);
ans+=((n-1-sum)&1?-1:1)*x;
ans%=mod;
}
ans<0?ans+=mod:1;
cout<<ans;
return 0;
}

bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理的更多相关文章

  1. BZOJ4596: [Shoi2016]黑暗前的幻想乡

    Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪 ...

  2. 洛谷P4336 [SHOI2016]黑暗前的幻想乡 [Matrix-Tree定理,容斥]

    传送门 思路 首先看到生成树计数,想到Matrix-Tree定理. 然而,这题显然是不能Matrix-Tree定理硬上的,因为还有每个公司只能建一条路的限制.这个限制比较恶心,尝试去除它. 怎么除掉它 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Struts2之配置文件中Action的详细配置(续)

    承接上一篇 4.处理结果的配置 Action类的实例对象调用某个方法,处理完用户请求之后,将返回一个逻辑视图名的字符串.核心Filter收到返回的逻辑视图名字符串,根据struts.xml中的逻辑视图 ...

  2. python脚本,计算起点终点高程

    import arcpy >>> import arcpy ... gd="D:/项目/shp/Pipe.gdb/ZK/GDPOINT" ... gx=" ...

  3. Jenkins 安装、配置与项目新建及构建

    1.Jenkins的安装与配置 1.1 java环境配置 Jenkins基于Java, Linux下安装java只要配置java环境变量即可. 首先,解压java到相应目录,我一般习惯把安装的软件放到 ...

  4. 用Vue.js开发微信小程序:开源框架mpvue解析

    前言 mpvue 是一款使用 Vue.js 开发微信小程序的前端框架.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程 ...

  5. 阿里云API网关(18)请求报文和响应报文

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  6. Linux知识积累(5) 关机shutdown和重启reboot

    Linux centos关机与重启命令详解与实战 Linux centos重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 1 ...

  7. 测试驱动开发实践4————testSave之新增文档分类

    [内容指引] 1.确定"新增文档分类"的流程及所需的参数 2.根据业务规则设计测试用例 3.为测试用例赋值并驱动开发 一.确定"新增文档分类"的流程及所需的参数 ...

  8. layer ui插件显示tips时,修改字体颜色

    今天做调查问卷,又遇到一个蛋疼小问题,记录下. 调查问卷有很多选项是要求必填的,如果不填的话,需要给出友好的提示.用的如下组件:http://layer.layui.com/ 1.之前一直默认用的: ...

  9. POJ-2031 Building a Space Station---MST + 空间距离

    题目链接: https://vjudge.net/problem/POJ-2031 题目大意: 就是给出三维坐标系上的一些球的球心坐标和其半径,搭建通路,使得他们能够相互连通.如果两个球有重叠的部分则 ...

  10. Android P新功能特性抢先看

    2018年3月8日,Google推出了Android P Preview版本,并提供官方镜像下载. 为了让广大开发者能够及时了解Android P的新功能特性,提前为您的app进行良好适配,WeTes ...