首页 > 其他分享 >uoj #37. 【清华集训2014】主旋律

uoj #37. 【清华集训2014】主旋律

时间:2023-03-21 09:48:16浏览次数:49  
标签:DAG 钦定 入度 37 SCC uoj 2014 dp mod

考虑原先求的是 SCC 为 1 的方案数,这很困难!因为并没有能够转移到子问题的路径。

不妨考虑容斥,即 SCC 为 1 的方案数=所有方案数-SCC 不为 1 的方案数。

不妨先集合划分出 SCC,然后就变成了,内部的 SCC 子问题(此时因为钦定的 SCC 个数 >1,因此规模一定变小)以及外层的 DAG 计数。

不妨先考虑内层的 DAG 计数。

此时与原问题、原图没有一点关系!我们仅仅考虑一般有向图的删边后成为 DAG 这个子问题!!!

即当前图有若干个入度为 0 的点。考虑我们拓扑的过程,把这入度为 0 的点都搞一次之后删去其出边,之后一定又出现若干入度为 0 的点,否则因为其是个 DAG,则拓扑结束。也就是说,当我们钦定入度为 0 的点之后,我们将 DAG 计数转为了子规模的 DAG 计数。

即设 \(t(S)\) 为点集 \(S\) 的点导出子图的删边后成为 DAG 的方案数,\(f(T,S)\) 为 \(S\) 中恰好入度为 0 的点集为 \(T\) 的 DAG 方案数。但恰好很难求,考虑钦定。即 \(g(T,S)\) 为钦定 \(S\) 中入度为 0 的点集为 \(T\) 的 DAG 方案数。

则有

\[g(T,S)=\sum_{T\subseteq R}f(R,S) \]

子集反演

\[f(T,S)\sum_{T\subseteq R}(-1)^{|R|-|T|}g(R,S) \]

\[t(S)=\sum_{T\subseteq S,T\not= \phi}f(T,S) \]

\[\sum_{T\subseteq S,T\not= \phi}f(T,S)=\sum_{T\subseteq S,T\not=\phi}\sum_{T\subseteq R\subseteq S,R\not=\phi}(-1)^{|R|-|T|}g(R,S)=...=\sum_{R\subseteq S,R\not=\phi}(-1)^{|R|+1}g(R,S) \]

注意到,此时的 DAG 计数仅仅与你钦定的入度为 \(0\) 的点集有关!

考虑回到原问题,即考虑钦定点集 \(T\) 作为入度为 \(0\) 的 SCC 的点集,但其内部的 SCC 还要集合划分!但我们只关心什么?因为是钦定!!!对于容斥系数而言,我们只关心其划分的 SCC 的个数的奇偶以及其方案数。

考虑记 \(f1(S)\) 为 \(S\) 的点集划分出奇数个 SCC 的方案数,\(f0(S)\) 为偶数个。

记 \(dp(S)\) 为删边使得其为 DAG 的方案数。

那么我们有 \(dp(S)=2^{c(S,S)}-缩完点后的点数为 2 的子图数目\)。

考虑钦定点集 \(T\) 作为入度为 \(0\) 的 SCC 点集,注意是钦定。那么就变成了 \(T\) 自己内部的子问题。又因为我们要求当前 SCC 个数 >1,所以并不会回到当前规模的问题!!!

那么要如何求 \(dp'(S)\),为 \(S\) 划分出 >1 个 SCC 的方案数/yiw

考虑缩点后的图,既然只关心 \(T\),那么钦定完之后,其他咋办!考虑 \(g(T,S)\) 在原问题的定义是钦定 \(T\) 中的点缩完点后在入度为 0 的 SCC 内!所以可以存在不属于 \(T\) 的点存在于入度为 \(0\) 的 SCC 内。因此钦定完,就直接瞎连了。

那么我们有 \(dp'(S)=\sum_{T\subseteq S,T\not=\phi}(f1(T)-f0(T))2^{c(T,S-T)+c(S-T,S-T)}\),不难发现,我们实际上就是在考虑其缩点后的情况。也就是说,本质就是在用 \(g\) 去贡献啦。只是对应的图一张是原图,一张是缩点后的图。并且,这个时候,我们当前数到的 SCC 数量一定 >1,这是因为,可能 =1 的情况当且仅当 \(T=S\),而我们钦定的 \(f1(S),f0(S)\) 此时均没有包含只有一个 SCC 的情况!我们并不会回到当前规模的问题,所以没事。

然后 \(f1,f0\) 的转移是平凡的,考虑钦定其中某一个点所在的 SCC 的点集即可转移。

#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int mod=(int)(1e9+7);
pair<int,int>e[1000];
int dp[(1<<15)],f0[(1<<15)],f1[(1<<15)],n,m,ou[(1<<15)],pw[1000];

inline int cal(int S,int T) {
	int res=0;
	while(S) {
		int x=(S&(-S));
		res+=__builtin_popcount(ou[x]&T);
		S-=x;
	}
	return res;
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=m;i++) {
		int x,y; cin>>x>>y; --x; --y;
		e[i]=make_pair(x,y);
		ou[1<<x]|=(1<<y);
	}
	pw[0]=1;
	for(int i=1;i<=m;i++) pw[i]=pw[i-1]*2%mod;
	for(int S=1;S<(1<<n);S++) {
		int p=__builtin_ffs(S);
//		for(int i=0;i<n;i++) {
//			if((S>>i)&1) {
//				p=i; break ;
//			}
//		}
		int SS=(S^p);
		for(int T=SS;;T=(T-1)&SS) {
			int TT=(T|p);
			f1[S]=(f1[S]+dp[TT]*f0[S^TT]%mod)%mod;
			f0[S]=(f0[S]+dp[TT]*f1[S^TT]%mod)%mod;
//			del[S]=(del[S]-dp[TT]*del[S^TT]%mod)%mod;
			if(!T) break ;
		}
		
		dp[S]=pw[cal(S,S)];
		for(int T=S;T;T=(T-1)&S) {
			dp[S]=(dp[S]-(f1[T]-f0[T]+mod)%mod*pw[cal(T,(S^T))]%mod*pw[cal((S^T),(S^T))]%mod)%mod;
			dp[S]=(dp[S]%mod+mod)%mod;
		}f1[S]=(f1[S]+dp[S])%mod;
//		cout<<dp[S]<<" "<<del[S]<<'\n';
	}
	cout<<(dp[(1<<n)-1]%mod+mod)%mod;
	return 0;
}

标签:DAG,钦定,入度,37,SCC,uoj,2014,dp,mod
From: https://www.cnblogs.com/xugangfan/p/17238807.html

相关文章

  • P3747 [六省联考 2017] 相逢是问候
    [六省联考2017]相逢是问候P3747[六省联考2017]相逢是问候题目描述Informatikverbindetdichundmich.信息将你我连结。B君希望以维护一个长度为\(n\)的数......
  • 洛谷 P3758 [TJOI2017]可乐
    https://www.luogu.com.cn/problem/P3758给定一张图。一个机器人在1号点,每次它可以选择留在原地,沿一条边行走一次,自爆。机器人自爆后无法进行任何操作,求t时间内它所有可......
  • LeetCode337周赛T4 -- 同余
    1.题目描述T42.思路其实本题非常简单。我们只需要知道一个概念:“同余”。即:\(a==b(modc)\),我们称\(a\)和\(b\)相等在\(modc\)意义下。知道了这个点,......
  • 6321.执行操作后地最大mex-337
    执行操作后的最大mex给你一个下标从0开始的整数数组nums和一个整数value。在一步操作中,你可以对nums中的任一元素加上或减去value。例如,如果nums=[1,2,3]......
  • 6352.美丽子集的数目-337
    美丽子集的数目给你一个由正整数组成的数组nums和一个正整数k。如果nums的子集中,任意两个整数的绝对差均不等于k,则认为该子数组是一个美丽子集。返回数组n......
  • MT6737 android 7.0 竖屏横用后u盘以及下载app无法打开
    问题描述:MT6737android7.0竖屏横用后u盘以及下载app无法打开问题的原因:下载APP的布局不支持横屏显示修改方法:diff--gita/frameworks/base/packages/DocumentsUI/Androi......
  • 【洛谷】P5904 [POI2014]HOT-Hotels(长链剖分)
    原题链接题意给出一棵有\(n\)个点的树,求有多少组点\((i,j,k)\)满足\(i,j,k\)两两之间的距离都相等。\((i,j,k)\)与\((i,k,j)\)算作同一组。\(1\len\le10^5\)......
  • 37、linux安装、卸载软件命令dpkg
    dpkg是DebianPackager的简写。为Debian专门开发的套件管理系统,方便软件的安装、更新及移除。所有源自Debian的Linux发行版都使用dpkg,例如Ubuntu、Knoppix......
  • 修复SQLServer 2014支持 TLS 1.2
    修复原因:当把.netcore应用程序部署到linux或docker中去的时候,连接sqlserver数据库可能报错如下:Aconnectionwassuccessfullyestablishedwiththeserver,butthena......
  • 【题解】UOJ#37. [清华集训2014]主旋律
    我自己写的代码自己都看不懂。所以芝士一种船新做法,爱来自学弟,lc学长好工作。题意校内OJ的题面过于简洁,人话:给定一个有向的强连通图,问任意删边使得新图仍强连通的方......