P4336 [SHOI2016]黑暗前的幻想乡
矩阵树定理(高斯消元+乘法逆元)+容斥
ans=总方案数 -(公司1未参加方案数 ∪ 公司2未参加方案数 ∪ 公司3未参加方案数 ∪ ...... ∪ 公司n未参加方案数)
方案数=生成树方案数 所以用矩阵树定理瞎搞
显然后面的部分可以用容斥原理求解
枚举的时候用一个数转成二进制来表示哪些公司参加/不参加
mod=1e9+7是质数所以可以在高斯消元的时候用逆元搞
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
typedef long long ll;
template <typename T> inline void read(T &x){
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
}
const int mod=1e9+;
inline ll ksm(ll x,int y){
ll res=;
for(;y;y>>=){
if(y&) res=res*x%mod;
x=x*x%mod;
}return res;
}
struct edge{int x,y;}a[][];
ll f[][];
int n,b[];
inline ll det(){ //高斯消元
ll res=; int c=;
for(int i=;i<n;++i){
int p=i;
for(int j=i+;j<n;++j) if(f[j][i]>f[p][i]) p=j;
if(p!=i) swap(f[i],f[p]),c=-c; //注意行列式每次交换行符号都会改变
for(int j=i+;j<n;++j){
ll div=f[j][i]*ksm(f[i][i],mod-)%mod; //除法转成乘逆元
for(int k=i;k<n;++k) f[j][k]=(f[j][k]-f[i][k]*div%mod+mod)%mod;
}
res=res*f[i][i]%mod;
}return (res*c+mod)%mod;
}
int main(){
read(n); ll ans=;
for(int i=;i<n;++i){
read(b[i]);
for(int j=;j<=b[i];++j) read(a[i][j].x),read(a[i][j].y);
}
for(int i=;i<=(<<(n-))-;++i){ //i转为二进制数表示方案:0/1 表示是否参加
memset(f,,sizeof(f)); //清空重建图
int p=i,cnt=;
for(int j=;p;++j,p>>=){
if(!(p&)) continue; //二进制表示下该位为0->没参加该方案
for(int k=;k<=b[j];++k){ //kirchhoff矩阵=度数矩阵-邻接矩阵
int X=a[j][k].x,Y=a[j][k].y;
++f[X][X]; ++f[Y][Y];
f[X][Y]=(f[X][Y]-+mod)%mod; //注意减法要重新取模
f[Y][X]=(f[Y][X]-+mod)%mod;
}++cnt;
}
ans=(ans+((n--cnt)& ? -det():det())+mod)%mod; //容斥原理决定是加还是减
}printf("%lld",ans);
return ;
}
P4336 [SHOI2016]黑暗前的幻想乡的更多相关文章
- 题解 P4336 [SHOI2016]黑暗前的幻想乡
题解 前置芝士 :矩阵树定理 本题是一道计数题,有两个要求: 建造的公路构成一颗生成树 每条公路由不同的公司建造,每条公路与一个公司一一映射 那么看到这两个要求后,我们很容易想到第一个条件用矩阵树定理 ...
- 洛谷P4336 [SHOI2016]黑暗前的幻想乡 [Matrix-Tree定理,容斥]
传送门 思路 首先看到生成树计数,想到Matrix-Tree定理. 然而,这题显然是不能Matrix-Tree定理硬上的,因为还有每个公司只能建一条路的限制.这个限制比较恶心,尝试去除它. 怎么除掉它 ...
- Luogu P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理+容斥原理
真是菜到爆炸....容斥写反(反正第一次写qwq) 题意:$n-1$个公司,每个公司可以连一些边,求每个边让不同公司连的生成树方案数. 矩阵树定理+容斥原理(注意到$n$不是很大) 枚举公司参与与否的 ...
- bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 559 Solved: 325[Submit][Sta ...
- bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 464 Solved: 264[Submit][Sta ...
- [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)
这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...
- 【BZOJ 4596】 4596: [Shoi2016]黑暗前的幻想乡 (容斥原理+矩阵树定理)
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 324 Solved: 187 Description ...
- 【BZOJ4596】[Shoi2016]黑暗前的幻想乡 容斥+矩阵树定理
[BZOJ4596][Shoi2016]黑暗前的幻想乡 Description 幽香上台以后,第一项措施就是要修建幻想乡的公路.幻想乡有 N 个城市,之间原来没有任何路.幽香向选民承诺要减税,所以她打 ...
- bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥)
bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥) bzoj Luogu 题解时间 看一看数据范围,求生成树个数毫无疑问直接上矩阵树定理. 但是要求每条边都 ...
随机推荐
- 打jar包
1.在文件夹中新建文件manifest.mf 2.在dos窗口中jar cvfm 名字.jar manifest.mf 所有的编译的类class,中间有空格 3.在dos窗口java -jar 名字 ...
- MySQL Error 1215: Cannot add foreign key constraint
MySQL Error 1215: Cannot add foreign key constraint DROP TABLE IF EXISTS `r_role_region`; CREATE TAB ...
- USB--- kvm in ubuntu:
USB SS=USB SuperSpeed=USB 3.0!!顺应此前的USB 1.1 FullSpeed和USB 2.0 HighSpeed https://jingyan.baidu.com/ar ...
- 深入理解朴素贝叶斯(Naive Bayes)
https://blog.csdn.net/li8zi8fa/article/details/76176597 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.朴素贝叶斯原理简 ...
- SpringMVC:JSON形式输出(基于Fastjson)
在Spring3.0中,@ResponseBody标记可以将对象"封装"为JSON形式的数据,并输出,下面的例子中使用的是阿里的Fastjson JSONaz解析工具,在sprin ...
- 用 Python 替代 Bash 脚本(转)
add by zhj: 其实作者是想说用Python来做那些Bash实现起来比较麻烦的部分,即将Bash与Python结合使用. 英文原文:http://www.linuxjournal.com/co ...
- 【2014腾讯实习招聘-面试-移动client开发】
版权声明:本文为博主原创文章,欢迎转载,转载请注明出处. https://blog.csdn.net/kana007/article/details/24375423 个人学习整理.如 ...
- plsql的sql窗口中文模糊查询没有作用
环境变量新增: NLS_LANG = AMERICAN_AMERICA.AL32UTF8
- uvloop —— 超级快的 Python 异步网络框架
简短介绍 asyncio是遵循Python标准库的一个异步 I/O框架.在这篇文章里,我将介绍 uvloop: 可以完整替代asyncio事件循环.uvloop是用Cython写的,基于 libuv. ...
- [LeetCode] 429. N-ary Tree Level Order Traversal_ Easy
Given an n-ary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...