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. 常用的 html 标签及注意事项

    <a> 标签 用法:用于定义超链接 清除浏览器默认样式: a { text-decoration: none;/* 去除下划线 */ color: #333;/* 改变链接颜色 */ } ...

  2. js判断IE浏览器版本(IE8及以下)

    var DEFAULT_VERSION = 8.0; var ua = navigator.userAgent.toLowerCase(); var isIE = ua.indexOf("m ...

  3. SpringBoot项目如何进行打包部署

    springboot的打包方式有很多种.有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的.这里主要介绍如何打成jar进行部署.不推荐用war,因为spring ...

  4. Extensions in UWP Community Toolkit - FrameworkElement Extensions

    概述 UWP Community Toolkit Extensions 中有一个为FrameworkElement 提供的扩展 - FrameworkElement Extensions,本篇我们结合 ...

  5. spring5——Aop的实现原理(动态代理)

    spring框架的核心之一AOP,面向切面编程是一种编程思想.我对于面向切面编程的理解是:可以让我们动态的控制程序的执行流程及执行结果.spring框架对AOP的实现是为了使业务逻辑之间实现分离,分离 ...

  6. django 配置URLconf和获取值

    django中正确配置url匹配找到视图: 1 在项目下的settings.py中ROOT_URLCONF = "项目名.urls" 表示 前台发来请求会先去项目下的test3/u ...

  7. Mysql官方文档翻译系列-7.3.1 Establishing a Backup Policy

    原文链接 (https://dev.mysql.com/doc/refman/5.7/en/backup-policy.html) 正文 To be useful, backups must be s ...

  8. Java面试题—初级(4)

    31.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可能,"xyz" ...

  9. jacascript JSON对象的学习

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! JSON (javascript object notation) 全称是 javascript 对象表示 ...

  10. 1025InnoDB log file 设置多大合适

    转自 http://blog.csdn.net/langkeziju/article/details/51094289 数据库的东西,往往一个参数就牵涉N多知识点.所以简单的说一下.大家都知道inno ...