这道题跟另一道题很像,先看看那道题吧


巨神兵(obelisk)

题面
  • 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图。欧贝利斯克认为一个没有环的有向图是优美的,请问这张图有多少个子图(即选定一个边集)是优美的?答案对 1,000,000,0071,000,000,0071,000,000,007 取模。
  • n&lt;=17n&lt;=17n<=17
分析
  • 这道题就是枚举拓扑序最后的点集来转移
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN = 17, MAXS = 1<<17, MAXM = 250, mod = 1e9+7;
int n, m, flag[MAXS], f[MAXS], mul[MAXM+1], sum[MAXS], in[MAXS];
bool g[MAXN][MAXN];
int main ()
{scanf("%d%d", &n, &m);for(int x, y, i = 1; i <= m; i++)scanf("%d%d", &x, &y), g[x-1][y-1] = true; //邻接表存图flag[0] = -1;for(int s = 1; s < (1<<n); s++) flag[s] = flag[s>>1] * (s & 1 ? -1 : 1); //求容斥系数 奇数个为1 偶数个为-1mul[0] = 1;for(int i = 1; i <= m; i++) mul[i] = mul[i-1] * 2 % mod; //预处理2^kf[0] = 1;for(int i = 0; i < (1<<n)-1; i++){for(int k = 0; k < n; k++) in[1<<k] = 0; //计算入度 把k点的入度存在 1<<k上for(int j = 0; j < n; j++)if(i & (1<<j))for(int k = 0; k < n; k++)in[1<<k] += g[j][k];int t = (1<<n)-1-i; //t为当前状态的补集,即剩下的点sum[0] = 0;for(int s = (t-1)&t; ; s = (s-1)&t) //枚举本次选取的点对于t的补集{int now = t ^ s, last = now & -now; //now 是本次选取的点sum[now] = sum[now-last] + in[last];f[i+now] = ((LL)f[i+now] + (LL)flag[now] * mul[sum[now]] * f[i]) % mod;if(!s) break;}}printf("%d\n", (f[(1<<n)-1]+mod)%mod);
}

BZOJ 3812 主旋律

  • 这道题做法差不多,不过是枚举拓扑序最后的强连通分量来进行转移
    详见大佬博客 Miskcoo’s Space
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int MAXS = 1<<15;
const int MAXN = 15;
int n, m, Out[MAXS], In[MAXS], mul[MAXN*MAXN];
int f[MAXS], g[MAXS], bitcnt[MAXS], h[MAXS], p[MAXS];
int main () {scanf("%d%d", &n, &m);for(int i = 0, x, y; i < m; ++i) {scanf("%d%d", &x, &y);x = 1 << (x-1);y = 1 << (y-1);Out[x] |= y;In[y] |= x;}mul[0] = 1;for(int i = 1; i < n*n; ++i)mul[i] = 2ll * mul[i-1] % mod;bitcnt[0] = 0;for(int i = 1; i < (1<<n); ++i)bitcnt[i] = bitcnt[i>>1] + (i&1);for(int state = 1; state < (1<<n); ++state) {int one = state & -state, Outside = state ^ one;for(int i = Outside; i; i = (i-1)&Outside)g[state] = (g[state] - 1ll * f[state^i] * g[i] % mod) % mod;h[state] = h[Outside] + bitcnt[In[one]&Outside] + bitcnt[Out[one]&Outside];f[state] = mul[h[state]];for(int sub = state; sub; sub = (sub-1)&state) {if(sub != state) {int del = (sub^state) & -(sub^state);p[sub] = p[sub^del] + bitcnt[Out[del]&sub] - bitcnt[In[del]&(sub^state)];}else p[sub] = 0;f[state] = (f[state] - 1ll * mul[h[state^sub]+p[sub]] * g[sub] % mod) % mod;}g[state] = (g[state] + f[state]) % mod;}printf("%d\n", (f[(1<<n)-1]+mod)%mod);
}

BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)相关推荐

  1. P5664 [CSP-S2019] Emiya 家今天的饭(dp+容斥)

    题目传送门 题意 这个题的意思就是说,每一行只能选一个(你可以选你也可以不选,但是你只能选一个),你选出来的种类数nnn,其中n/2n/2n/2不能是同一列的东西,请问你有多少种选法. 思路 这道题, ...

  2. [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)

    problem luogu-P3160 solution 这么小的数据范围,非暴力不状压.暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了. 我们不妨从小到大填数字,这样如果局部极小值点还 ...

  3. bzoj 1042: [HAOI2008]硬币购物(dp+容斥)

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2555  Solved: 1537 [Submit][St ...

  4. bzoj 4455 [Zjoi2016]小星星 树形dp容斥

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 643  Solved: 391 [Submit][Statu ...

  5. BZOJ2339: [HNOI2011]卡农(dp 容斥)

    题意 从$1 - n$中任意选择一些数,选$m$次构成$m$个集合 保证: 集合不为空 任意两个集合不相同 集合内各个元素xor起来等于0 Sol 神仙题Orz 我看到两种做法,一种是洛谷题解上的直接 ...

  6. CF296B dp\容斥

    传送门 文章目录 题意: 思路: 题意: n≤1e5n\le1e5n≤1e5 思路: 求方案数基本就是考虑dpdpdp了,看到nnn这么大可以考虑一下分情况讨论的dpdpdp状态. 设f[i][j]f ...

  7. P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】

    前言 话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 nnn张卡的权值为1 ...

  8. AT4352-[ARC101C] Ribbons on Tree【dp,容斥】

    正题 题目链接: https://www.luogu.com.cn/problem/AT4352 https://atcoder.jp/contests/arc101/tasks/arc101_c 题 ...

  9. 小奇遐想 树状数组实现+容斥思想

    问题 M: 小奇遐想 时间限制: 1 Sec  内存限制: 128 MB 提交: 165  解决: 21 [提交] [状态] [讨论版] [命题人:admin] 题目描述 撷来一缕清风飘渺 方知今日书 ...

  10. [LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)

    先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和.于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即 ...

最新文章

  1. JavaScript函数与Window对象
  2. 通过反射获取DLL的类实现加载窗体
  3. 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-第5章-具有一般耦合结构的时滞复杂网络同步
  4. Joomla2.5 JDate 时区日期运算
  5. vantUI弹框组件 message文字,如何换行 ?
  6. 【java】swing窗口中JPanel和JFrame的应用
  7. unix编程之文件锁,exit
  8. ldap实现用户认证
  9. 博文视点Open Party——PPT演示专家秘技 报名中
  10. [导入]XACT与X3DAudio整合的问题
  11. input输入框大小设置_Qualtrics调查问卷设计1-如何在输入框前后添加辅助文字
  12. Python错误篇 | UserWarning: findfont: Font family [‘SimHei‘] not found. Falling back to DejaVu Sans.
  13. 基于微信小程序的校园信息共享平台 毕业设计-附源码211615
  14. 【VBA】Excel根据指定字段自动分页sheet功能的实现
  15. ACL访问控制列表(访问控制、抓取感兴趣流)详解及基本ACL和高级ACL的配置。
  16. lisp 非对称缓和曲线_CAD画缓和曲线lisp程序
  17. 银行存款对账java代码_银行存款对账方法
  18. php商品在最少购买,ecshop每个商品添加最少购买量最小订购量
  19. 产品读书《用户界面设计-有效的人机交互策略》
  20. 雅虎高管解读财报 当务之急是分拆资产

热门文章

  1. linux课程以及Linux主要学习哪些内容
  2. xUtils框架t网络加载图片 结合SwipeRefreshLayou下拉刷新
  3. ListView嵌套viewpager 头部图片轮换,listview 进行下拉刷新
  4. 同一局域网建立ftp服务器实现文件共享
  5. BZOJ4319: cerc2008 Suffix reconstruction Suffix Array 的理解
  6. Zabbix 3.0 监控Web [七]
  7. TCP connection succeeded but Erlang distribution failed
  8. 电脑鼠标双击桌面图标打不开怎么办
  9. 反激开关电源的工作原理
  10. Python OCR识别图片