题解 主旋律
时间:2021-08-09
本文章向大家介绍题解 主旋律,主要包括题解 主旋律使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Description
输入格式
输出格式
样例
数据范围与提示
首先我们可以考虑如何计算一个点集的是 DAG 完全子图个数。设这个叫 \(D(S)\) ,定义 \(w(S,T)\) 表示 \(S\to T\) 的边数,\(h(S)\) 为 \(w(S,S)\)。
我们可以枚举哪些点入度为 \(0\),那么我们可以通过容斥得到转移式:
\[D(S)=2^h(S)-\sum_{T \subset S} (-1)^{|T|+1}D(S\otimes T)2^{w(T,S\otimes T)}
\]
考虑到原问题。我们设 \(f(S)\) 表示集合 \(S\) 的是 scc 的完全子图个数,\(g(S)\) 表示将 \(S\) 分成奇数个 scc 的方案数减去偶数个 scc 的方案数。(原因见上式)
同样的,我们可以枚举哪些 scc 在缩点后的图上入度为 \(0\) ,可以得到转移式:
\[f(S)=2^h(S)-\sum_{T\subseteq S}g(T)2^{w(T,S\otimes T)}2^{h(S\otimes T)}
\]
\[g(S)=f(S)-\sum_{T\subset S} f(S\otimes T)\times g(T)
\]
不过需要注意的是你在计算 \(g(S)\) 的时候需要钦定一下顺序,否则会算重,具体来说可以每次当前的 scc 都必须包含一个固定点。
Code
#include <bits/stdc++.h>
using namespace std;
#define Int register int
#define mod 1000000007
#define MAXN 17
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
template <typename T> inline void chkmax (T &a,T b){a = max (a,b);}
template <typename T> inline void chkmin (T &a,T b){a = min (a,b);}
int n,m,pw[MAXN * MAXN],toS[MAXN],lg[1 << 16],siz[1 << 16],cnt[1 << 16],f[1 << 16],g[1 << 16];
int mul (int a,int b){return 1ll * a * b % mod;}
int dec (int a,int b){return a >= b ? a - b : a + mod - b;}
int add (int a,int b){return a + b >= mod ? a + b - mod : a + b;}
void Sub (int &a,int b){a = dec (a,b);}
void Add (int &a,int b){a = add (a,b);}
int lowbit (int x){return x & (-x);}
int getw (int S1,int S2){
int res = 0;
while (S1){
int now = lowbit(S1);
S1 -= now,now = lg[now] + 1;
res += siz[toS[now] & S2];
}
return res;
}
signed main(){
read (n,m),pw[0] = 1;
for (Int i = 1;i <= m;++ i) pw[i] = add (pw[i - 1],pw[i - 1]);
for (Int i = 1;i < n;++ i) lg[pw[i]] = i;
for (Int S = 0;S < (1 << n);++ S) siz[S] = siz[S >> 1] + (S & 1);
for (Int i = 1,u,v;i <= m;++ i) read (u,v),toS[u] |= (1 << v - 1);
for (Int S = 0;S < (1 << n);++ S) cnt[S] = getw (S,S);
for (Int S = 1;S < (1 << n);++ S){
int nS = S ^ lowbit(S);
for (Int T = nS;T;T = (T - 1) & nS) Sub (g[S],mul (f[S ^ T],g[T]));
f[S] = pw[cnt[S]];
for (Int T = S;T;T = (T - 1) & S) Sub (f[S],mul (g[T],mul (pw[getw (T,S ^ T)],pw[cnt[S ^ T]])));
Add (g[S],f[S]);
}
write (f[(1 << n) - 1]),putchar ('\n');
return 0;
}
原文地址:https://www.cnblogs.com/Dark-Romance/p/15120571.html
- 《Redis设计与实现》读书笔记(十) ——Redis对象相关其他设计与实现
- CI一些优秀实践
- 《Redis设计与实现》读书笔记(十一) ——Redis数据库与键空间
- assert断言
- 什么是堆和栈,它们在哪儿?
- contain_of宏定义
- 《Redis设计与实现》读书笔记(十三) ——Redis数据库其他内容与总结
- 《Redis设计与实现》读书笔记(十四) ——Redis RDB文件创建、载入与自动保存原理
- 框架 | Spark中的combineByKey
- 《Redis设计与实现》读书笔记(十五) ——Redis AOF持久化原理与实现
- PHP CodeBase: 生成N个不重复的随机数
- PHP转义Json里的特殊字符的函数
- PHP使用SOAP调用.net的WebService问题
- 框架 | spray-routing的核心流程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Flutter Unit 重大更新 1 】超好用的组件收藏夹上线
- android特卖列表倒计时卡顿问题的解决方法
- dotnet 多线程禁止同时调用相同的方法 禁止方法重入调用 双检锁的设计
- android实现倒计时功能(开始、暂停、0秒结束)
- 【-Flutter/Dart 语法补遗-】 sync* 和 async* 、yield 和yield* 、async 和 await
- android实现条目倒计时功能
- Android实现简单手电筒功能
- k8s安装自动证书签发cert-manager letsencrypt
- Android仿Keep运动休息倒计时圆形控件
- android通过led实现手电筒功能
- Android 7.0 手电筒控制实现
- 【STM32H7】第13章 RL-TCPnet V7.X之创建多个TCP客户端
- Android倒计时的开始与停止 剩余时分秒的展示
- 由LFI引起的Zimbra邮件管理系统0day
- Android手电筒兼容各个手机与版本