60pts:

每个DAG的拓扑序是唯一的,所以考虑将DAG分层。f[i][j]记录当前选择的节点状态是i,最后一层的节点状态为j(dep取最大)。

初始状态:$f[i][i]=1;i\in [1,1<<n)$。那么我们第一层枚举当前状态i,第二层枚举[1,1<<n)。那么令s=i&j,t=j&(~i),s即为i的一个子集,所以令s为当前的最后一层,t为i

的补集的一个子集,令t为转移后的最后一层,要求s到t中每个点都有边。枚举t中每个点,设ch1为集合$i-s$当前点的边数,ch2为s集合到当前点的边数,转移方程:$f[i$|$t][t]+=f[i][s]*\prod 2^{ch1}*\prod (2^{ch2}-1)$;

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<bitset>
#include<vector>
#define LL long long
using namespace std;
const int mod=1e9+;
struct edge
{
int u,v,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define n(x) ed[x].nxt
}ed[];
int first[],num_e;
#define f(x) first[x]
int n,m,ru[];
LL f[<<][<<];
vector<int> fr[];
bool pd(int s,int t)
{
bool ok=;
for(int i=;i<=n;i++)
if((<<i-)&t)
{
bool pd2=;
for(int j=;j<fr[i].size();j++)
if((<<fr[i][j]-)&s)pd2=;
ok&=pd2;
}
return ok;
}
LL find(int s,int po)
{
int res=;
for(int i=;i<fr[po].size();i++)
if((<<fr[po][i]-)&s)res++;
return res;
}
LL poww(LL a,int b);
inline void add(int u,int v);
signed main()
{
cin>>n>>m;int tu,tv;
for(int i=;i<=m;i++)cin>>tu>>tv,add(tu,tv),ru[tv]++,fr[tv].push_back(tu); for(int i=;i<(<<n);i++)f[i][i]=;
for(int i=;i<(<<n);i++)
{
for(int j=;j<(<<n);j++)
{
int s=i&j,t=j&(~i);
bitset<>t1(i),t2(s),t3(t);
// cout<<t1<<" "<<t2<<" "<<(t1|t3)<<" "<<t3<<endl;
if(s&&t&&pd(s,t))
{
int ch1=,ch2=;
for(int k=;k<=n;k++)
if((<<k-)&t)
{
int cnt1=find(i&(~s),k),cnt2=find(s,k);
ch1=ch1*poww(,cnt1)%mod;ch2=ch2*(poww(,cnt2)-)%mod;
}
f[i|t][t]=((f[i|t][t]+f[i][s]*ch1*ch2)%mod)%mod;
}
// cout<<f[i][s]<<" -> "<<f[i|t][t]<<endl;
}
}
LL ans=;
// for(int i=1;i<(1<<n);i++)
for(int j=;j<(<<n);j++)
ans=(ans+f[(<<n)-][j])%mod;
printf("%lld\n",ans);
}
inline void add(int u,int v)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
n(num_e)=f(u);
f(u)=num_e;
}
LL poww(LL a,int b)
{
LL ans=;
while(b)
{
if(b&)ans=ans*a%mod;
a=a*a%mod;b=b>>;
}
return ans;
}

100pts:

考虑将第二维去掉,f[i]表示当前集合为i时的方案数,那么$f[i]=\sum f[i][j]$,如果不记录最后一层的话,每一个j都会被计算进去多次,所以容斥一下就可以了(稍不明白)。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<bitset>
#include<vector>
#define re register
#define co const
#define rec re co
#define LL long long
using namespace std;
const int mod=1e9+;
struct edge
{
int u,v,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define n(x) ed[x].nxt
}ed[];
int first[],num_e;
#define f(x) first[x]
int n,m,ru[];
LL f[<<],g[<<];
int tem[<<][];
vector<int> fr[];
bool pd(int s,int t)
{
bool ok=;
for(int i=;i<=n;i++)
if((<<i-)&t)
{
bool pd2=;
for(int j=;j<fr[i].size();j++)
if((<<fr[i][j]-)&s)pd2=;
ok&=pd2;
}
return ok;
}
LL find(rec int s,rec int po)
{
int res=;
for(int i=;i<fr[po].size();i++)
if((<<fr[po][i]-)&s)res++;
return res;
}
int pw[];
int siz[<<];
LL poww(LL a,int b);
inline void add(rec int u,rec int v);
signed main()
{
// freopen("obelisk9.in","r",stdin); cin>>n>>m;int tu,tv;
for(re int i=;i<=m;i++)scanf("%d%d",&tu,&tv),add(tu,tv),ru[tv]++,fr[tv].push_back(tu); for(re int i=;i<(<<n);i++){bitset<>t(i);siz[i]=t.count();}
for(re int i=;i<(<<n);i++)for(re int j=;j<=n;j++)tem[i][j]=find(i,j);
f[]=;
pw[]=;for(int i=;i<=;i++)pw[i]=pw[i-]*%mod;
for(int i=;i<=n;i++)g[<<i-]=i;
int tttttt=(<<n);
for(re int i=;i<tttttt;i++)
{
int all=(~i)&(tttttt-);
for(re int k=all;k;k=(k-)&all)
{
int cnt=;
for(re int j=k;j;j-=(j&-j))
cnt+=tem[i][g[j&-j]]; if(siz[k]&)f[i|k]=(f[i|k]+f[i]*pw[cnt]%mod);
else f[i|k]=(f[i|k]-f[i]*pw[cnt]%mod);
if(f[i|k]<)f[i|k]=f[i|k]%mod+mod;
if(f[i|k]>=mod)f[i|k]-=mod;
}
} printf("%lld\n",(f[(<<n)-]%mod+mod)%mod);
}
inline void add(rec int u,rec int v)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
n(num_e)=f(u);
f(u)=num_e;
}
LL poww(LL a,int b)
{
LL ans=;
while(b)
{
if(b&)ans=ans*a%mod;
a=a*a%mod;b=b>>;
}
return ans;
}

HZOJ 巨神兵的更多相关文章

  1. BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)

    这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...

  2. [CSP-S模拟测试]:巨神兵(状压DP)

    题目描述 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张$n$个点$m$条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张图有多少个子图(即选定一个边集)是优美的?答案对$1,000 ...

  3. csp-s模拟测试57(10.2)「天空龙」·「巨神兵」·「太阳神」

    题目是古埃及神话??? A. 天空龙 傻逼模拟,看来没有滑天下之大稽QAQ,也没有打错快读(大雾...) B. 巨神兵 难度爆增,一脸懵比..... 60分状压: 因为是求有向图,关于有向图好像拓扑用 ...

  4. hzoj 2301(莫比乌斯反演)

    题意 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公 数. 思路: 与先前的那个相比,这次a,c并不一定 ...

  5. NOIp模拟赛 巨神兵(状压DP 容斥)

    \(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...

  6. 【2016NOIP十连测】【test4】【状压DP】【容斥原理】巨神兵

    题目大意: 给一个n个点(n<=17),m条边的有向图(无自环.无重边),求其无环子图的方案数. 题解: 看到n<=17,显然是用状压dp. 用f[i]表示点集i的满足条件的方案数. 状态 ...

  7. HZOJ 单

    两个子任务真的是坑……考试的时候想到了60分的算法,然而只拿到了20分(各种沙雕错,没救了……). 算法1: 对于测试点1,直接n遍dfs即可求出答案,复杂度O(n^2),然而还是有好多同学跑LCA/ ...

  8. 20191102 「HZOJ NOIP2019 Round #12」20191102模拟

    先开坑. md原题写挂我也真是... 100+20+10 白夜 打表大法吼 显然,不在环上的点对答案的贡献是 \((k-cycle)^{k-1}\) . 打表得到环上的递推式,矩阵一下乘起来就好了. ...

  9. 20191004 「HZOJ NOIP2019 Round #9」20191004模拟

    综述 第一次 rk1 ,激动. 题目是 COCI 18/19 Round #1 的三至五题. 得分 \(100+100+20\) \(\mathrm{cipele}\) 问题描述 HZOJ1313 题 ...

随机推荐

  1. 使用 windows 批处理指令(BAT文件)进行压缩文件(zip)解压操作

    以下指令包括文件删除.复制.zip文件解压操作.使用7z指令指令进行解压操作前,需要确保 windows 的 path 系统环境变量中存在7z的安装路径. 7z的下载地址:https://www.7- ...

  2. Leetcode150. Evaluate Reverse Polish Notation逆波兰表达式求值

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

  3. Leetcode415Add Strings字符串相加

    给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包 ...

  4. JosnRpcClient

    <?php /** * Simple JSON-RPC interface. */ namespace org; class JosnRpcClient{ protected $host; pr ...

  5. LUOGU P1779 魔鬼杀手_NOI导刊2010提高(03)

    传送门 解题思路 背包,首先先用aoe都打残然后单伤补刀,用f[i]表示AOE打了i的伤害的最小花费,g[i]表示单伤打了i的伤害的最小花费. 代码 #include<iostream> ...

  6. vmware 虚拟机有时候显示有网络访问,但是打不开网页的白痴解决办法

    我遇到这种情况的原因是经常更换电脑连接方式(手机wifi.校园网有线网.校园网无线网.电信网.隔壁同学wifi网),所以ip经常变动,所以产生了解决此问题的方法 先连好网络-->打开编辑--&g ...

  7. Python中3种内建数据结构:列表、元组和字典

    Python中3种内建数据结构:列表.元组和字典 Python中有3种内建的数据结构:列表.元组和字典.参考简明Python教程 1. 列表 list是处理一组有序项目的数据结构,即你可以在一个列表中 ...

  8. mvp例子与MVVM例子

    VMP例子 <!-- 从百度CDN上面找个jquery的链接 --> <!DOCTYPE html> <html lang="en"> < ...

  9. 全面解析vue-cli生成的项目中使用其他库(js库、css库)

    前言:最近有小伙伴问我,是不是用vue脚手架生成的项目就不能jquery了呢?显然,答案是否定的,必须能用.但是个人建议最好不要用了,用人家vue提供的不好嘛. 一.用vue-cli生成项目 1. v ...

  10. System.ArgumentException: 回发或回调参数无效。在配置中使用 < pages enableEventValidation="true"/>

    转载自http://blog.csdn.net/dongge825/article/details/7868151 关于在同一个页面中使用Gridview控件的时候发现气updaeting事件无法被服 ...