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]黑暗前的幻想乡的更多相关文章

  1. 题解 P4336 [SHOI2016]黑暗前的幻想乡

    题解 前置芝士 :矩阵树定理 本题是一道计数题,有两个要求: 建造的公路构成一颗生成树 每条公路由不同的公司建造,每条公路与一个公司一一映射 那么看到这两个要求后,我们很容易想到第一个条件用矩阵树定理 ...

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

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

  3. Luogu P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理+容斥原理

    真是菜到爆炸....容斥写反(反正第一次写qwq) 题意:$n-1$个公司,每个公司可以连一些边,求每个边让不同公司连的生成树方案数. 矩阵树定理+容斥原理(注意到$n$不是很大) 枚举公司参与与否的 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Python面向对象之属性

    属性的定义和调用 1,定义时,在普通方法的基础上添加@property装饰器 2,定义时,属性仅有一个self参数 3,调用时,无需括号 vim day7-8.py #!/usr/bin/python ...

  2. bootstrapValidator remote 的接受 验证 值

    本来之前也做过一次这样的验,但可能是这两天太热脑袋不够用了,于是就只有看看源码咯 that.updateStatus(updateAll ? $f.attr('data-bv-field') : $f ...

  3. POJ 1986 - Distance Queries - [LCA模板题][Tarjan-LCA算法]

    题目链接:http://poj.org/problem?id=1986 Description Farmer John's cows refused to run in his marathon si ...

  4. 删除server服务文件

    某用户升级ArcGIS for Server后,出现了之前版本server中的服务残留的现象,且服务访问不正常,怎样彻底删除的残留文件. 即怎样删除ArcGIS for Server中发布的某个服务涉 ...

  5. 14nm或于6月量产,中芯首次披露12nm及第二代FinFET "N+1"计划(详细数据)

    日前中芯国际公布2018年度第四季度业绩,实现营收7.88亿美元,14nm工艺进入客户验证阶段,可望于今年6月份量产,且12nm工艺开发取得突破. 根据中芯国际披露的财报,2018年第四季度实现营业收 ...

  6. 十天精通CSS3(4)

    text-overflow 与 word-wrap text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时 ...

  7. PAT 1027 Colors in Mars[简单][注意]

    1027 Colors in Mars (20)(20 分) People in Mars represent the colors in their computers in a similar w ...

  8. 在MS SQL删除重复行的几种方法

    1.如果有ID字段,就是具有唯一性的字段         delect   table   where   id   not   in   (             select   max(id) ...

  9. 23最小生成树之Kruskal算法

    图的最优化问题:最小生成树.最短路径 典型的图应用问题 无向连通加权图的最小生成树 有向/无向加权图的最短路径 四个经典算法 Kruskal算法.Prim算法---------------最小生成树 ...

  10. C++飞机大战

    #include<windows.h> #include"resource.h" #include<stdlib.h> #include<time.h ...