[题解] 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> # ...
随机推荐
- 可控线性序列机(查看除了inout端口外的其他变量的波形的方法)
可控线性序列机: 可控:有个控制端控制何时输出线性序列. 线性序列机:输出一个线性序列. 知识点: 1.包含多个判定条件时用英文()括起来,用&&连接. 2.使能端EN的设置(类似于D ...
- ajax04_实现关键字联想和自动补全
用ajax实现关键字联想和自动补全 遇到的小坑 回调函数相对window.onload的摆放位置 给回调函数addData传数据时,如何操作才能将数据传进去 代码实现 前端代码 <!DOCTYP ...
- springmvc源码笔记-HandlerMapping注入
在springmvc中,如何根据url找到controller以及对应方法,依赖的是HandlerMapping接口的getHandler方法 在spring容器中默认注册的HandlerMappin ...
- 网易云UI模仿-->侧边栏
侧边栏 效果图 界面分解 可以看到从上到下的流式布局.需要一个Column来容纳,并且在往上滑动的过程中顶部的个人信息是不会动的.所以接下来需要将剩余部分占满使用Flexibel组件. 实现 个人信息 ...
- C# 给Word每一页设置不同文字水印
Word中设置水印时,可预设的文字或自定义文字设置为水印效果,但通常添加水印效果时,会对所有页面都设置成统一效果,如果需要对每一页或者某个页面设置不同的水印效果,则可以参考本文中的方法.下面,将以C# ...
- CentOS Docker安装 && docker 基础指令
1 # 直接从官网下载docker的安装命令包(docker已经很贴心将安装shell脚本帮我们准备好了) 2 curl -fsSL get.docker.com -o get-docker.sh 3 ...
- SkiaSharp 之 WPF 自绘 投篮小游戏(案例版)
此案例主要是针对光线投影法碰撞检测功能的示例,顺便做成了一个小游戏,很简单,但是,效果却很不错. 投篮小游戏 规则,点击投篮目标点,就会有一个球沿着相关抛物线,然后,判断是否进入篮子里,其实就是一个矩 ...
- LeetCode使用JavaScript破解两数之和
有人相爱,有人夜里开车看海,我是leetcode第一题都做不出来 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返 ...
- C#/VB.NET 将PDF转为PDF/X-1a:2001
PDF/X-1a是一种PDF文件规范标准,在制作.使用PDF以及印刷时所需要遵循的技术条件,属于PDF/X-1标准下的一个子标准. PDF/X-1标准有由CGATS于1999年制定的PDF/X-1:1 ...
- 正则表达式实战:最新豆瓣top250爬虫超详细教程
检查网页源代码 首先让我们来检查豆瓣top250的源代码,一切网页爬虫都需要从这里开始.F12打开开发者模式,在元素(element)页面通过Ctrl+F直接搜索你想要爬取的内容,然后就可以开始编写正 ...