BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)
这道题跟另一道题很像,先看看那道题吧
巨神兵(obelisk)
题面
- 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图。欧贝利斯克认为一个没有环的有向图是优美的,请问这张图有多少个子图(即选定一个边集)是优美的?答案对 1,000,000,0071,000,000,0071,000,000,007 取模。
- n<=17n<=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 偶数个为-1
mul[0] = 1;
for(int i = 1; i <= m; i++) mul[i] = mul[i-1] * 2 % mod; //预处理2^k
f[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)的更多相关文章
- NOIp模拟赛 巨神兵(状压DP 容斥)
\(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...
- 【noip模拟赛7】上网 线性dp
描述 假设有n个人要上网,却只有1台电脑可以上网.上网的时间是从1 szw 至 T szw ,szw是sxc,zsx,wl自创的时间单位,至于 szw怎么换算成s,min或h,没有人清楚.依次给出每个 ...
- 【noip模拟赛5】任务分配 降维dp
描述 现有n个任务,要交给A和B完成.每个任务给A或给B完成,所需的时间分别为ai和bi.问他们完成所有的任务至少要多少时间. 输入 第一行一个正整数n,表示有n个任务.接下来有n行,每行两个正整数a ...
- (计数器)NOIP模拟赛(神奇的数位DP题。。)
没有原题传送门.. 手打原题QAQ [问题描述] 一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9.其中—个页码不含多余的0,如N=1234时第5页不是00 ...
- bzoj 3622 DP + 容斥
LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...
- 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 94 Solved: 53 Description 废话不多说,反正小w要发喜 ...
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】
前言 话说在\(Loj\)下了个数据发现这题的名字叫\(fgo\) 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 \(n\)张卡的权值为\(1 ...
- 【noip模拟赛5】细菌 状压dp
[noip模拟赛5]细菌 描述 近期,农场出现了D(1<=D<=15)种细菌.John要从他的 N(1<=N<=1,000)头奶牛中尽可能多地选些产奶.但是如果选中的奶牛携 ...
随机推荐
- python 脚本备份mssql数据库并删除数据库
一.实现脚本 # -*- coding=utf-8 -*- import pyodbc from datetime import datetime import pymssql import os i ...
- 《Mysql 锁 - 概述》
一:锁类型(加锁范围区分类型) - MySQL里面的锁可以分为:全局锁.表级锁.行级锁. 二:全局锁 - 作用 - 对整个数据库实例加锁. - 加锁方式 - MySQL提供加全局读锁的方法:Flus ...
- PAT甲级 二叉查找树 相关题_C++题解
二叉查找树 PAT (Advanced Level) Practice 二叉查找树 相关题 目录 <算法笔记> 重点摘要 1099 Build A Binary Search Tree ( ...
- DRF图片路径问题的解决方法,网上爬取的图片放到ImageFiled自动带上域名
由于博客园不支持markdown,推荐下面的url访问 原创url: https://blog.csdn.net/weixin_42495873/article/details/89440437 - ...
- (转)从0移植uboot (二) _uboot启动流程分析
ref:https://www.cnblogs.com/xiaojiang1025/p/6496704.html 经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够 ...
- 面试经典算法:快速排序Golang实现
Golang快速排序 定义 快速排序由C. A. R. Hoare在1962年提出.快速排序是对冒泡排序的一种改进,采用了一种分治的策略. 基本思想 通过一趟排序将要排序的数据分割成独立的两部分,其中 ...
- 20-MySQL DBA笔记-可扩展的架构
第20章 可扩展的架构 本章将为读者讲述可扩展的架构相关的知识和技术.可扩展的架构意味着这个架构伸缩性好,我们可以用更多的节点来提高吞吐率,而性能(响应时间)不会下降到不可接受的范围.互联网世界飞速发 ...
- (六)授权(下):自定义permission
一.Authorizer.PermissionResolver及RolePermissionResolver Authorizer的职责是进行授权(访问控制),是Shiro API中授权核心的入口点, ...
- 通过DBCC Page查看在SQL Server中哪行数据被锁住了?
原文:通过DBCC Page查看在SQL Server中哪行数据被锁住了? 如何查看被锁的是哪行数据?通过dbcc page可以. 要想明白这个问题: 首先,需要模拟阻塞问题,这里直接模拟了阻塞问题的 ...
- 从零开始学ios开发(二):Hello World!
今天看了书的第二章,主要介绍了一下Xcode的使用方法和一些必要的说明,最后做了一个“Hello World!”的小程序,其实就是在屏幕上用一个Label显示“Hello World!”,一行代码都没 ...