BZOJ 4596: [Shoi2016]黑暗前的幻想乡
Sol
容斥原理+Matrix-Tree定理.容斥跟小星星那道题是一样的,然后...直接Matrix-Tree定理就可以了...
复杂度\(O(2^{n-1}n^3)\)
PS:调了好久啊QAQ 明明知道了Matrix-Tree定理了以后非常简单QAQ n-1写成n 直接真·爆0.
Code
- /**************************************************************
- Problem: 4596
- User: BeiYu
- Language: C++
- Result: Accepted
- Time:6040 ms
- Memory:1296 kb
- ****************************************************************/
- #include<cstdio>
- #include<cstring>
- #include<utility>
- #include<vector>
- #include<iostream>
- using namespace std;
- #define mpr(a,b) make_pair(a,b)
- #define _0(x) ((x>0?x:-x)>0)
- typedef long long LL;
- const int N = 18;
- const LL p = 1000000007;
- int n,cnt,S;LL ans;int pow2[N];
- vector<pair<int,int> > g[N];
- LL a[N][N];
- inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
- while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
- LL Pow(LL a,LL b,LL res=1){ for(;b;b>>=1,a=a*a%p) if(b&1) res=res*a%p;return res; }
- void Build(int S){
- memset(a,0,sizeof(a));cnt=0;
- for(int i=0;i<n-1;i++) if(S&pow2[i]){
- cnt++;
- for(int j=0;j<g[i].size();j++){
- int u=g[i][j].first,v=g[i][j].second;
- a[u][v]--,a[v][u]--,a[u][u]++,a[v][v]++;
- }
- }
- for(int i=0;i<n;i++) for(int j=0;j<n;j++) a[i][j]=(a[i][j]+p)%p;
- // for(int i=0;i<n;i++) for(int j=0;j<n;j++) printf("%10I64d%c",a[i][j]," \n"[j==n-1]);
- // cout<<"*******************"<<endl;
- }
- LL det(int n){
- LL res=1;int swpt=0;
- for(int i=0,j,k;i<n;i++){
- if(!_0(a[i][i])){
- for(j=i+1;j<n;j++) if(_0(a[j][i])) break;
- if(j>=n) return 0;
- for(k=i;k<n;k++) swap(a[i][k],a[j][k]);
- swpt++;
- }
- res=(res*a[i][i]%p+p)%p;
- LL inv=Pow(a[i][i],p-2);
- // for(j=i+1;j<n;j++) a[i][j]/=a[i][i];
- // for(j=i+1;j<n;j++) for(k=i+1;k<n;k++) a[j][k]-=a[j][i]*a[i][k];
- for(j=i+1;j<n;j++) for(k=i+1;k<n;k++) a[j][k]=(a[j][k]-a[j][i]*a[i][k]%p*inv%p+p)%p;
- }if(swpt&1) return -res;return res;
- }
- int main(){
- n=in();pow2[0]=1;for(int i=1;i<17;i++) pow2[i]=pow2[i-1]<<1;
- for(int i=0;i<n-1;i++){ int x=in();for(int j=1,u,v;j<=x;j++) u=in()-1,v=in()-1,g[i].push_back(mpr(u,v)); }
- for(S=1;S<pow2[n-1];S++){
- // Build(S);
- // cout<<cnt<<" "<<det(n-1)<<endl;
- Build(S);
- if((n-1-cnt)&1) ans=(ans-det(n-1)+p)%p;else ans=(ans+det(n-1))%p;
- }cout<<(ans+p)%p<<endl;return 0;
- }
BZOJ 4596: [Shoi2016]黑暗前的幻想乡的更多相关文章
- bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 559 Solved: 325[Submit][Sta ...
- ●BZOJ 4596 [Shoi2016]黑暗前的幻想乡
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4596 题解: 容斥,矩阵树定理,矩阵行列式 先说说容斥:(一共有 N-1个公司) 令 f[i ...
- bzoj 4596: [Shoi2016]黑暗前的幻想乡【容斥原理+矩阵树定理】
真是简单粗暴 把矩阵树定理的运算当成黑箱好了反正我不会 这样我们就可以在O(n^3)的时间内算出一个无向图的生成树个数了 然后题目要求每个工程队选一条路,这里可以考虑容斥原理:全选的方案数-不选工程队 ...
- BZOJ 4596: [Shoi2016]黑暗前的幻想乡(容斥+Matrix_Tree)
传送门 解题思路 看到计数想容斥--\(from\) \(shadowice1984\)大爷.首先求出原图的生成树个数比较容易,直接上矩阵树定理,但这样会多算一点东西,会把\(n-2\)个公司的多算进 ...
- 【BZOJ 4596】 4596: [Shoi2016]黑暗前的幻想乡 (容斥原理+矩阵树定理)
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 324 Solved: 187 Description ...
- 【BZOJ】4596: [Shoi2016]黑暗前的幻想乡
[题意]给定n个点的无向完全图,有n-1个公司各自分管一部分路,要求所有公司都有修路的生成树数.n<=17. [算法]容斥原理+生成树计数(矩阵树定理) [题解]每个生成树方案是一个公司有无修路 ...
- bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 464 Solved: 264[Submit][Sta ...
- bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥)
bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥) bzoj Luogu 题解时间 看一看数据范围,求生成树个数毫无疑问直接上矩阵树定理. 但是要求每条边都 ...
- [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)
这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...
随机推荐
- 动态规划 求解 Minimum Edit Distance
http://blog.csdn.net/abcjennifer/article/details/7735272 自然语言处理(NLP)中,有一个基本问题就是求两个字符串的minimal Edit D ...
- authorization配置
在 Web.config 文件的<configuration>标记的子标记<authorization>和</authorization>之间用于设置应用程序的授权 ...
- C-基本语法与运算
编译: Technorati 标记: C 1, 编译compilers 命令make 将高级语言转换为低级语言. clang: 1,预处理(preprocessing) 2,编译(complition ...
- 小技能——markdown
如果常常要在电脑上写点东西,比如写笔记.做总结.写博客之类的,花一两个小时学会markdown还是很值的. markdown简介 markdown不是某个软件,而是一种标记语言,标记普通文本的格式,以 ...
- ServletContext中常用方法
..获取Tomcat的Context的初始化参数. 1.获取Tomcat的server.xml中设置Context的初始化参数. 例如: <Context path="/testcon ...
- jsp应用
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 查看mysql数据库的数据引擎
1, SHOW VARIABLES LIKE 'storage_engine'; 2,show table status from 数据库库名 where name='表名',例: mysql> ...
- shell学习之路:shell基础大全1
http://note.youdao.com/share/?id=a9d02257b639c94323c818bc38423919&type=note 别名命令alias:http://n ...
- Linux启动管理:grub
1.grub中分区表示 Linux 中 /dev/sda1 在grub中为 hd0,0 代表第一个硬盘的第一个分区 Linux中 /dev/sdb3是扩展分区 在grub中为 ...
- MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍,需要的朋友参考下 MySQL数据库insert和update语句引:用于操作数 ...