题目

考虑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(i-1,j+1)+=g(i,j),g(i-1,j)+=g[i][j]
\]

两个转移分别代表一条待定边选或不选。注意转移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,容斥的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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 ...

  4. 【题解】P3349 [ZJOI2016]小星星 - 子集dp - 容斥

    P3349 [ZJOI2016]小星星 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 小 \(Y\) 是一个心灵手巧 ...

  5. SRM 223 Div II Level Two: BlackAndRed,O(N)复杂度

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=3457&rd=5869 解答分析:http://comm ...

  6. SRM 207 Div II Level Two: RegularSeason,字符串操作(sstream),多关键字排序(操作符重载)

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=2866&rd=5853 主要是要对字符串的操作要熟悉,熟 ...

  7. SRM 577 Div II Level Two: EllysRoomAssignmentsDiv2

    题目来源: http://community.topcoder.com/tc?module=ProblemDetail&rd=15497&pm=12521 这个问题要注意的就是只需要直 ...

  8. SRM 582 Div II Level One: SemiPerfectSquare

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12580 比较简单,代码如下: #include <ios ...

  9. SRM 582 Div II Level Two SpaceWarDiv2

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12556 #include <iostream> # ...

随机推荐

  1. break和continue语句的使用

    break break关键字的用法有常见的两种: 1.可以用在switch语句当中,一旦执行整个switch语句like结束. 2.还可以用在循环语句当中,一旦执行,整个循环语句立刻结束,打断循环 关 ...

  2. Dubbo源码(五) - 服务目录

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 今天,来聊聊Dubbo的服务目录(Directory).下面是官方文档对服务目录的定义: 服务目 ...

  3. MySQL为什么"错误"选择代价更大的索引

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 MySQL优化器索引选择迷思. 高鹏(八怪)对本文亦有贡献. 1. 问题描述 群 ...

  4. thinkphp 5 及一下或php项目里实现模糊查询

    想在thinkPHP或者PHP项目实现模糊查询怎么实现呢? 今天在网上搜了一下用 mysql里的 like 就可以实现 怎么用呢? 看代码: 错误用法: where('title','like',$s ...

  5. kubernetes之Endpoint引入外部资源实践;

    1. 什么是Endpoint? 我们创建Service的时候会自动给我们创建一个同名的Endpoint资源,每一个同名的 Servie都有一个Endpoints资源,因为Service自己并不直接匹配 ...

  6. React报错之Expected an assignment or function call and instead saw an expression

    正文从这开始~ 总览 当我们忘记从函数中返回值时,会产生"Expected an assignment or function call and instead saw an express ...

  7. Vue3 + Socket.io + Knex + TypeScript 实现可以私聊的聊天室

    前言 下文只在介绍实现的核心代码,没有涉及到具体的实现细节,如果感兴趣可以往下看,在文章最后贴上了仓库地址.项目采用前后端模式,前端使用 Vite + Vue3 + TS:后端使用 Knex + Ex ...

  8. Unity 将是驱动 C# 增长的引擎吗 ?

    C# 在中国的采用需要一个杀手级应用的带动, 那么这样的一个杀手级应用是 Unity吗,我这里大胆推测采用CoreCLR 的新一代完全采用C#构建的Unity 将是这样的一个杀手级应用.Unity已被 ...

  9. PerfView专题 (第七篇):如何洞察触发 GC 的 C# 代码?

    一:背景 上一篇我们聊到了如何用 PerfView 洞察 GC 的变化,但总感觉还缺了点什么? 对,就是要跟踪到底是什么代码触发了 GC,这对我们分析由于 GC 导致的 CPU 爆高有非常大的参考价值 ...

  10. Flink介绍

    1,简介 Flink是Apache基金会旗下的一个开源大数据处理框架.Flink很牛逼,好多牛逼的公司都在用. 2,特征 *高吞吐和低延迟.每秒处理百万个时间,毫秒级延迟.有点既要老婆好,又要彩礼少的 ...