【bzoj4596】黑暗前的幻想乡
Solution
这题的话。。因为\(N\)比较小啊所以我们可以大力容斥(尽管实际算下来复杂度有点爆炸不过实测是能过的qwq)
枚举包含了哪些颜色的边,每次重新填矩阵然后矩阵树定理高消求一波行列式然后乘上个容斥系数加到答案里面去就好了
关于容斥原理这个东西。。(怎么感觉快忘光了)
其实也不用想太多,反正是从最终状态(包含所有的,在这里是包含\(n-1\)种)开始往后推符号为一正一负就好了:
\]
然后代码大概长这个样子
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=20,MOD=1e9+7;
struct xxx{
int x,y,nxt;
}a[100010];
int A[N][N],h[N],ok[N];
int n,m,tot,ans;
void add(int x,int y,int col);
int solve(int n);
int Abs(int x){return x>0?x:-x;}
bool in(int st,int x){return st>>(x-1)&1;}
int work();
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int x,y;
scanf("%d",&n);
memset(h,-1,sizeof(h));
tot=0;
for (int i=1;i<n;++i){
scanf("%d",&m);
for (int j=1;j<=m;++j){
scanf("%d%d",&x,&y);
add(x,y,i);
}
}
ans=0;
int all=1<<n-1,cnt,tmp,n1;
for (int i=1;i<all;++i){
memset(A,0,sizeof(A));
cnt=0;
for (int j=1;j<n;++j)
if (in(i,j)){
for (int k=h[j];k!=-1;k=a[k].nxt){
x=a[k].x; y=a[k].y;
++A[x][x]; ++A[y][y];
--A[x][y]; --A[y][x];
}
}
else ++cnt;
tmp=solve(n-1);
if (cnt&1)
ans=(ans-tmp+MOD)%MOD;
else
ans=(ans+tmp)%MOD;
}
printf("%d\n",ans);
}
void add(int x,int y,int col){
a[++tot].x=x; a[tot].y=y; a[tot].nxt=h[col]; h[col]=tot;
}
int solve(int n){
int id,ret=1,tmp;
for (int i=1;i<=n;++i){
for (id=i;id<=n;++id)
if (A[id][i]) break;
if (id>n) continue;
if (id!=i){
ret=-ret;
for (int j=i+1;j<=n;++j) swap(A[i][j],A[id][j]);
}
for (int j=i+1;j<=n;++j){
while (A[j][i]){
tmp=A[j][i]/A[i][i];
for (int k=1;k<=n;++k)
A[j][k]=(1LL*A[j][k]+MOD-1LL*tmp*A[i][k]%MOD)%MOD;
if (A[j][i]==0) break;
ret=-ret;
for (int k=1;k<=n;++k)
swap(A[j][k],A[i][k]);
}
}
}
for (int i=1;i<=n;++i)
ret=1LL*ret*A[i][i]%MOD;
return (ret+MOD)%MOD;
}
【bzoj4596】黑暗前的幻想乡的更多相关文章
- 【BZOJ4596】黑暗前的幻想乡(矩阵树定理,容斥)
[BZOJ4596]黑暗前的幻想乡(矩阵树定理,容斥) 题面 BZOJ 有\(n\)个点,要求连出一棵生成树, 指定了一些边可以染成某种颜色,一共\(n-1\)种颜色, 求所有颜色都出现过的生成树方案 ...
- 【BZOJ4596】[Shoi2016]黑暗前的幻想乡 容斥+矩阵树定理
[BZOJ4596][Shoi2016]黑暗前的幻想乡 Description 幽香上台以后,第一项措施就是要修建幻想乡的公路.幻想乡有 N 个城市,之间原来没有任何路.幽香向选民承诺要减税,所以她打 ...
- bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥)
bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥) bzoj Luogu 题解时间 看一看数据范围,求生成树个数毫无疑问直接上矩阵树定理. 但是要求每条边都 ...
- bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 464 Solved: 264[Submit][Sta ...
- bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 559 Solved: 325[Submit][Sta ...
- 「SHOI2016」黑暗前的幻想乡 解题报告
「SHOI2016」黑暗前的幻想乡 sb题想不出来,应该去思考原因,而不是自暴自弃 一开始总是想着对子树做dp,但是状态压不起去,考虑用容斥消减一些条件变得好统计,结果越想越乱. 期间想过矩阵树定理, ...
- [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)
这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...
- P4336 [SHOI2016]黑暗前的幻想乡
P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理(高斯消元+乘法逆元)+容斥 ans=总方案数 -(公司1未参加方案数 ∪ 公司2未参加方案数 ∪ 公司3未参加方案数 ∪ ...... ∪ ...
- 【BZOJ 4596】 4596: [Shoi2016]黑暗前的幻想乡 (容斥原理+矩阵树定理)
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 324 Solved: 187 Description ...
- BZOJ4596: [Shoi2016]黑暗前的幻想乡
Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪 ...
随机推荐
- pytest使用笔记(三)——pytest+allure+jenkins配置使用
按照pytest使用笔记(二)把pytest+allure配置好后,现在在jenkins配置好,先实现手动构建(立个小目标) 一,安装jenkins插件 首页->系统管理->插件管理,从“ ...
- centos7 python2.7.5 升级python3.6.4
(转)Linux Centos7 升级python2至python3 - 依然范儿特西的文章 - 知乎 https://zhuanlan.zhihu.com/p/33660059 1 查看python ...
- 【转】RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】
接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动化脚本通过RobotFrameWork将命令传递给Appium的客户端: 2.然后[Appium的客户端]将接受 ...
- 心中忐忑的跨进了Python的大门!
Hello!大家好,我是Jmmy 作为一个python初学者,抱着一种忐忑的心里走进了这扇让我有些胆怯的大门,因为零基础的缘故让我不得不再三去考虑学这门语言,英语.数学都是个渣的我,也许注定会止步门外 ...
- Ansible开发之路
一.初识Ansible 链接:https://www.cnblogs.com/baishuchao/articles/9164083.html 二.Ansible的架构 链接:https://www. ...
- Saving James Bond - Easy Version (MOOC)
06-图2 Saving James Bond - Easy Version (25 分) This time let us consider the situation in the movie & ...
- EasyUI validatebox 自定义ajax验证用户名是否已存在
<td><input type="text" id="userName" name="userName" class=&q ...
- 从零开始的Python学习Episode 9——集合
集合 集合是一个无序的,不重复的数据组合,是python基本的数据类型,把不同的元素组成一起就形成集合. 一.创建集合 s = set('smile')list = ['1','2','3']prin ...
- mac react-native从零开始android真机测试
1. 安装android相关jdk,(https://blog.csdn.net/vvv_110/article/details/72897142) 2. 手机和mac使用usb连接, 手机开发者设置 ...
- [linux] reboot和shutdown-r的区别
google看看: 先搜英文的资料 http://askubuntu.com/questions/441969/what-is-the-difference-between-reboot-and-sh ...