Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡
\(\mathcal{Description}\)
link.
有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树。对 \(10^9+7\) 取模。
\(2\le n\le17\),边集大小 \(0\le m_i\le\frac{n(n-1)}2\)。
\(\mathcal{Solution}\)
\(n\) 很小,考虑容斥。枚举这 \(n-1\) 个边集的子集,将子集内的边集的边加入图,用矩阵树定理求出生成树个数,容斥一下就好啦。复杂度 \(\mathcal O(2^nn^3)\)。
\(\mathcal{Code}\)
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
const int MAXN = 17, MOD = 1e9 + 7;
int n, m, d[MAXN + 5][MAXN + 5];
std::vector<std::pair<int, int> > able[MAXN + 5];
inline int qkpow ( int a, int b, const int p = MOD ) {
int ret = 1;
for ( ; b; a = 1ll * a * a % p, b >>= 1 ) ret = 1ll * ret * ( b & 1 ? a : 1 ) % p;
return ret;
}
inline int det ( int d[MAXN + 5][MAXN + 5] ) {
int ret = 1, swp = 1;
for ( int i = 1; i < n; ++ i ) {
for ( int j = i; j < n; ++ j ) {
if ( d[j][i] ) {
if ( i ^ j ) std::swap ( d[i], d[j] ), swp *= -1;
break;
}
}
if ( ! d[i][i] ) return 0;
ret = 1ll * ret * d[i][i] % MOD;
int inv = qkpow ( d[i][i], MOD - 2 );
for ( int j = i + 1; j < n; ++ j ) {
int c = 1ll * inv * d[j][i] % MOD;
for ( int k = i; k < n; ++ k ) d[j][k] = ( d[j][k] - 1ll * c * d[i][k] % MOD + MOD ) % MOD;
}
}
return ( ret * swp + MOD ) % MOD;
}
int main () {
scanf ( "%d", &n );
for ( int i = 1, m; i < n; ++ i ) {
scanf ( "%d", &m );
for ( int u, v; m --; ) {
scanf ( "%d %d", &u, &v );
able[i].push_back ( { u, v } );
}
}
int ans = 0;
for ( int s = 1; s < 1 << n >> 1; ++ s ) {
int bit = 0; memset ( d, 0, sizeof d );
for ( int i = 1; i < n; ++ i ) {
if ( ( s >> i - 1 ) & 1 ) {
++ bit;
for ( int j = 0; j ^ able[i].size (); ++ j ) {
int u = able[i][j].first, v = able[i][j].second;
++ d[u][u], ++ d[v][v], -- d[u][v], -- d[v][u];
if ( d[u][v] < 0 ) d[u][v] += MOD;
if ( d[v][u] < 0 ) d[v][u] += MOD;
}
}
}
ans = ( ans + ( ( bit & 1 ) ^ ( n & 1 ) ? det ( d ) : -det ( d ) ) ) % MOD;
}
printf ( "%d\n", ( ans + MOD ) % MOD );
return 0;
}
Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡的更多相关文章
- 「SHOI2016」黑暗前的幻想乡 解题报告
「SHOI2016」黑暗前的幻想乡 sb题想不出来,应该去思考原因,而不是自暴自弃 一开始总是想着对子树做dp,但是状态压不起去,考虑用容斥消减一些条件变得好统计,结果越想越乱. 期间想过矩阵树定理, ...
- P4336 [SHOI2016]黑暗前的幻想乡
P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理(高斯消元+乘法逆元)+容斥 ans=总方案数 -(公司1未参加方案数 ∪ 公司2未参加方案数 ∪ 公司3未参加方案数 ∪ ...... ∪ ...
- 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 题解时间 看一看数据范围,求生成树个数毫无疑问直接上矩阵树定理. 但是要求每条边都 ...
- [LOJ2027] [SHOI2016] 黑暗前的幻想乡
题目链接 LOJ:https://loj.ac/problem/2027 洛谷:https://www.luogu.org/problemnew/show/P4336 Solution 这题很像[ZJ ...
- BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4596 https://www.luogu.org/problemnew/show/P4336#su ...
随机推荐
- JDBC 处理sql查询多个不确定参数
JDBC程序,为了防止SQL注入,通常需要进行参数化查询,但是如果存在多个不确定参数,就比较麻烦了,查阅了一些资料,最后解决了这个问题,现在这里记录一下: public List<TabDl ...
- Go语言发邮件
发送邮件是实际业务中经常会用到的一个功能,而在Go语言中实现发送邮件的库也有很多,这篇文章将介绍go语言中如何发邮件. 1. 登录QQ邮箱,选择账户,开启POP3/SMTP服务和IMAP/SMTP服务 ...
- Windows系统上搭建Clickhouse开发环境
Windows系统上搭建Clickhouse开发环境 总体思路 微软的开发IDE是很棒的,有两种:Visual Studio 和 VS Code,一个重量级,一个轻量级.近年来VS Code越来越受欢 ...
- 《挑战程序设计竞赛》1.6.2-POJ的题目Ants
#include <stdio.h> #define max(a, b) (((a) > (b)) ? (a) : (b)) #define min(a, b) (((a) < ...
- springBoot--01--快速入门
笔记源码:https://gitee.com/ytfsL/springboot 1.1 原有Spring优缺点分析 1.1.1 Spring的优点分析 Spring是Java企业版(Java Ente ...
- JDK原子操作类
在Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型.原子更新数组.原子更新引用和原子更新属性(字段).Atomic包里的类基本都是使用Unsafe实现的包装类. ...
- netty系列之:请netty再爱UDT一次
目录 简介 netty对UDT的支持 搭建一个支持UDT的netty服务 异常来袭 TypeUDT和KindUDT 构建ChannelFactory SelectorProviderUDT 使用UDT ...
- element 日期时间选择器type = "datetimerange",限制时间的选择范围
这里限制了只能选择一周的时间 pickerOptions:{ onPick(time){ // 如果选择了只选择了一个时间 i ...
- 新手如何入门linux,linux原来还可以这么学
前言 在这个只有cangls和小白两人的小房间中,展开了一次关于学习方法的讨论. 小白:cangls啊,我想请教一个问题,您是如何记住那么多linux命令的. cangls:我啊,别人都看我的小电影, ...
- 为什么 Redis 的查询很快, Redis 如何保证查询的高效
Redis 如何保证高效的查询效率 为什么 Redis 比较快 Redis 中的数据结构 1.简单动态字符串 SDS 对比 c 字符串的优势 SDS可以常数级别获取字符串的长度 杜绝缓冲区溢出 减少修 ...