[题解] Topcoder 15279 SRM 761 Div 1 Level 3 SpanningSubgraphs DP,容斥
题目
考虑DP。\(f(msk,i)\) 表示集合 \(msk(一定包含0号点)\) ,选了恰好i条边的连通方案数。转移用容斥,用这个点集内部所有连边方案减去不连通的。令\(|e_{msk}|\)表示两个端点都在集合msk内的边数,D为\(e_{\complement_{msk}sub}\)(sub在msk中补集内部的边集)。转移式:\(f(msk,i)=\binom{|e_{msk}|}{i}-\sum_{sub \in msk,0 \in sub,0 \leq j \leq i} f(sub,j)\cdot \binom{|D|}{i-j}\),其中sigma是枚举不连通情况中0号点所在的连通块。直接转移是\(O(3^nm^2)\)的,考虑优化。
我们枚举msk,现在需要计算\(f(msk,*)\)的值。观察转移式,后面一部分是\(\sum_{sub \in msk,0 \in sub,0 \leq j \leq i} f(sub,j)\cdot \binom{|D|}{i-j}\),枚举到\(f(sub,j)\)的时候,集合sub中的j条边已经确定要选了,我们现在要做的事就是依次决定sub外的\(|D|\)条边中哪些要选,如果有k条边选,就转移到\(f(msk,j+k)\)。
所以可以令\(g(i,j)\)表示已经有i条边确定要选,还有j条边“排队等待”决定。枚举所有可能转移到\(f(msk,*)\)的\(f(sub,j)\),让\(g(j,|D|)+=f(sub,j)\)。然后对\(g\)数组再做一次DP:
\]
两个转移分别代表一条待定边选或不选。注意转移g的时候j要从大到小枚举。最后我们让\(f(msk,i)-=g[i][0]\)就行了。总复杂度\(O(3^nm+2^nm^2)\),常数很小可以通过。
注意自环的处理。
点击查看代码
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <LL,LL>
#define fi first
#define se second
#define mpr make_pair
#define pb push_back
using namespace std;
const LL MOD=1000000007LL;
LL qpow(LL x,LL a)
{
LL res=x,ret=1;
while(a>0)
{
if((a&1)==1) ret=ret*res%MOD;
a>>=1;
res=res*res%MOD;
}
return ret;
}
LL n,m,in[33000],f[17000][210],g[210][210],fac[210],inv[210],cc[20];
vector <LL> gg[20];
LL C(LL nn,LL mm){return fac[nn]*inv[mm]%MOD*inv[nn-mm]%MOD;}
struct SpanningSubgraphs
{
vector <int> count(int N,vector <int> A,vector <int> B)
{
fac[0]=1;repn(i,205) fac[i]=fac[i-1]*(LL)i%MOD;
rep(i,203) inv[i]=qpow(fac[i],MOD-2);
n=N;m=A.size();
rep(i,m) if(A[i]!=B[i])
{
gg[A[i]].pb(B[i]);
gg[B[i]].pb(A[i]);
}
LL cnt=0;
rep(i,m) if(A[i]==B[i])
{
++in[1<<A[i]];++cc[A[i]];
if(A[i]==0) ++cnt;
}
repn(i,(1<<n)-1)
{
int lowbit=(i&-i),id=__builtin_ctz(lowbit);
in[i]=in[i^(1<<id)]+cc[id];
rep(j,gg[id].size()) if((i&(1<<gg[id][j]))>0) ++in[i];
}
rep(i,cnt+1) f[0][i]=C(cnt,i);
repn(msk,(1<<(n-1))-1)
{
int lim=in[(msk<<1)|1];
rep(i,lim+2) rep(j,lim+2) g[i][j]=0;
for(int sub=msk;;sub=(sub-1)&msk)
{
if(sub!=msk)
{
rep(i,in[(sub<<1)|1]+1)
(g[i][in[(msk^sub)<<1]]+=f[sub][i])%=MOD;
}
if(sub==0) break;
}
rep(i,lim+1) for(int j=lim;j>0;--j) if(g[i][j]>0)
{
(g[i+1][j-1]+=g[i][j])%=MOD;
(g[i][j-1]+=g[i][j])%=MOD;
}
repn(j,lim) f[msk][j]=(C(lim,j)-g[j][0]+MOD)%MOD;
}
vector <int> ans;
for(int i=n-1;i<=m;++i) ans.pb(f[(1<<(n-1))-1][i]);
return ans;
}
};
[题解] Topcoder 15279 SRM 761 Div 1 Level 3 SpanningSubgraphs DP,容斥的更多相关文章
- Codeforces Round #330 (Div. 2) B. Pasha and Phone 容斥定理
B. Pasha and Phone Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/595/pr ...
- Codeforces Round #258 (Div. 2) E. Devu and Flowers 容斥
E. Devu and Flowers 题目连接: http://codeforces.com/contest/451/problem/E Description Devu wants to deco ...
- Codeforces Round #330 (Div. 2)B. Pasha and Phone 容斥
B. Pasha and Phone Pasha has recently bought a new phone jPager and started adding his friends' ph ...
- 【题解】P3349 [ZJOI2016]小星星 - 子集dp - 容斥
P3349 [ZJOI2016]小星星 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 小 \(Y\) 是一个心灵手巧 ...
- SRM 223 Div II Level Two: BlackAndRed,O(N)复杂度
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=3457&rd=5869 解答分析:http://comm ...
- SRM 207 Div II Level Two: RegularSeason,字符串操作(sstream),多关键字排序(操作符重载)
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=2866&rd=5853 主要是要对字符串的操作要熟悉,熟 ...
- SRM 577 Div II Level Two: EllysRoomAssignmentsDiv2
题目来源: http://community.topcoder.com/tc?module=ProblemDetail&rd=15497&pm=12521 这个问题要注意的就是只需要直 ...
- SRM 582 Div II Level One: SemiPerfectSquare
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12580 比较简单,代码如下: #include <ios ...
- SRM 582 Div II Level Two SpaceWarDiv2
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12556 #include <iostream> # ...
随机推荐
- vue发布自定义组件到npm
一.使用 vue create currentdatetime创建项目(可查考https://cli.vuejs.org/zh/guide/creating-a-project.html),创建成功后 ...
- 【每天学一点-06】在Vue中使用Vant-Picker选择器,并且给选择器添加一个类似Antd-Select-showSearch的搜索功能
一.在Vant文档中,Picker组件的API中是没有showSearch这一选项的 1.Vant-Picker 文档 2.Antd-Select 文档 3.需要完成的需求 4.因为在H5项目中出现了 ...
- 5.26 NOI 模拟
\(T1\)石子与HH与HHの取 博弈是不可能会的 \(c_i\)相等,比较显然的\(Nim,\)直接前缀异或求一下 \(a_i=1,\)区间长度对\(2\)取模 结论\(:\)黑色石子严格大于白色个 ...
- 【Java面试】这道互联网高频面试题难住了80%的程序员?索引什么时候失效?
"索引什么时候失效?" 面试过程中,突如其来的一个问题,是不是有点懵? 没关系,关注我,面试不迷路. 我是Mic,一个工作了14年的Java程序员. 索引失效涉及到的知识点非常多, ...
- Gulp介绍及安装使用教程
一.简介 gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器,不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成,使用她,我们不仅可以很愉快的编写代码 ...
- Markdown 常用语法精讲
- #### 标题 (`# 跟标题名称一定要留空格`)> > # 一级标题> ## 二级标题> ### 三级标题> #### 四级标题> ##### 五级标题> ...
- Oracle-视图,约束
试图:试图是数据库对象之一视图在sql语句中体现的角色与表一致,但它不是一张真是存在的表,只是对应了一个查询语句的结果集当试图对应的子查询中含有函数或者表达式时,那么必须指定别名试图根据对应的子查询分 ...
- Oracle-DDL,DML理解以及应用
SQL语句:虽然SQL语句不区分大小写,但是字符串的值时区分大小写的.SQL是结构化查询语句,操作数据库需要向数据库发送SQL语句,数据库会理解SQL语句中含义并执行SQL语句分为:DDL(数据定义语 ...
- 开发H5程序或者小程序的时候,后端Web API项目在IISExpress调试中使用IP地址,便于开发调试
在我们开发开发H5程序或者小程序的时候,有时候需要基于内置浏览器或者微信开发者工具进行测试,这个时候可以采用默认的localhost进行访问后端接口,一般来说没什么问题,如果我们需要通过USB基座方式 ...
- Clickhouse基准测试实践
1.概述 本篇博客将对MySQL.InfluxDB.Clickhouse在写入时间.聚合查询时间.磁盘使用等方面的性能指标来进行比较. 2.内容 比较的数据集,是使用的Clickhouse官网提供的6 ...