传送门

Sol

考虑容斥

强联通图反过来就是一些缩点后的 \(DAG\)

一个套路就是对出(入)度为 \(0\) 的点进行容斥

设 \(g_S,h_S\) 分别表示选了奇数个 \(0\) 入度和偶数个的,集合为 \(S\) 的方案数

那么通过钦定一个特殊的点 \(u\) 有

\[g_S=\sum_{T\subset S,u \in T}f_Th_{S-T}
\]

\[h_S=\sum_{T\subset S,u \in T}f_Tg_{S-T}
\]

那么考虑容斥求出 \(f\),由于 \(g_S\) 包含 \(f_S\),而且 \(f_S\) 合法,所以容斥的时候 \(g_S\) 不能包括 \(f_S\)

那么

\[f_S=2^{|E_{\{S\}}|}+\sum_{T\subset S,T\ne S}(h_T-g_T)2^{E_{\{S-T\}}+E{_{\{T\}->\{S-T\}}}}
\]

这里的 \(g_S\) 不包括 \(f_S\),\(E\) 表示边集,\(\{S\}->\{T\}\) 即集合 \(S\) 到 \(T\) 的边

可以通过把子集弄出来做优化到 \(\Theta(3^n)\)

不过我没有写QwQ

# include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int mod(1e9 + 7); int n, m, f[1 << 15], g[1 << 15], h[1 << 15], cnt[1 << 15], to[20], e[1 << 15], pw[300]; inline void Inc(int &x, int y) {
if ((x += y) >= mod) x -= mod;
} int main() {
register int i, a, b, t, s, j;
scanf("%d%d", &n, &m), t = 1 << n;
for (i = 1; i <= m; ++i) scanf("%d%d", &a, &b), --a, --b, to[a] |= 1 << b;
for (i = 1; i < t; ++i) cnt[i] = cnt[i >> 1] + (i & 1);
for (pw[0] = i = 1; i <= m; ++i) {
pw[i] = pw[i - 1] << 1;
if (pw[i] >= mod) pw[i] -= mod;
}
for (i = 0; i < t; ++i)
for (j = 0; j < n; ++j) if (i >> j & 1) e[i] += cnt[to[j] & i];
for (i = 0; i < n; ++i) f[1 << i] = g[1 << i] = 1;
for (i = 1; i < t; ++i)
if (cnt[i] > 1) {
f[i] = pw[e[i]];
for (a = 0; a < n; ++a) if (i >> a & 1) break;
for (j = (i - 1) & i; j; j = (j - 1) & i) {
for (s = b = 0; b < n; ++b) if (i >> b & 1) s += cnt[to[b] & (i ^ j)];
Inc(f[i], 1LL * (h[j] - g[j] + mod) * pw[s] % mod);
if (j >> a & 1) {
Inc(g[i], 1LL * f[j] * h[i ^ j] % mod);
Inc(h[i], 1LL * f[j] * g[i ^ j] % mod);
}
}
Inc(f[i], (h[i] - g[i] + mod) % mod), Inc(g[i], f[i]);
}
printf("%d\n", f[t - 1]);
return 0;
}

最新文章

  1. 简单了解undo
  2. Webpack打包进阶
  3. VISUAL STUDIO 调试
  4. JavaScript基础---语言基础(2)
  5. linux:计算机概论
  6. javascript,jquery(闭包概念)
  7. Python中模拟enum枚举类型的5种方法分享
  8. Windows Serer 2003 配置手册 – 创建Active Dictionary域
  9. ExtJS4.1自带API打不开的问题解决
  10. 心路历程(一)-自学java两个月心得
  11. 【MyBatis-Spring】Mybatis和并入Spring框架
  12. ExtJS初探:了解 Ext Core
  13. pascal,c,c++使用大于2^32整型的注意要点
  14. Boostrap导航栏跳转到其他页面或外部链接
  15. python -input用户输入
  16. BZOJ4922 Karp-de-Chant Number(贪心+动态规划)
  17. bzoj 3522 tree-dp 暴力
  18. Virtual Judge SPOJ - LCS2 Longest Common Substring II
  19. Jedis连接Redis三种模式
  20. CentOS7安装redis,并设置开机自启动

热门文章

  1. win7 下如何安装 Microsoft Web Application Stress Tool
  2. P5242 [USACO19FEB]Cow Dating
  3. Jupyter notebook用法
  4. QuantLib 金融计算——随机过程之 Heston 过程
  5. 编程开发之--java多线程学习总结(4)
  6. Eclipse 的SVN 的分支
  7. 基础js--调试js
  8. 2-7 js基础-ajax封装
  9. [中英对照]Why Redis beats Memcached for caching | 在cache化方面,为何Redis胜过Memcached?
  10. Integer 与 int -- 自动装箱(autoboxing)与自动拆箱(unboxing)