首页 > 其他分享 >[ABC327G] Many Good Tuple Problems

[ABC327G] Many Good Tuple Problems

时间:2023-11-26 12:45:41浏览次数:26  
标签:二分 ABC327G Good 个点 int Many times 条边 dp

题目链接
简化题意:有一个 \(n\) 个点的图,问有多少个长度为 \(M\) 的边序列,满足连边后图是二分图。
\(n\le 30,m\le 10^9\)

考虑先强制要求无重边。

定义 \(f_{i,j}\) 为 \(i\) 个点,\(j\) 条边的图的二分图染色数量(染色方式不同算多次)。这个是可以通过枚举黑色点的数量算出来。

然后定义 \(g_{i,j}\) 为 \(i\) 个点,\(j\) 条边的连通图的二分图染色数量。\(g_{i,j}\) 等于 \(f_{i,j}\) 减去不连通的数量,枚举 \(1\) 号点的连通块大小 \(k\) 和边数 \(a\),然后 \(g_{i,j}\) 减去 \(g_{k,a}\times f_{i-k,j-a}\times \binom{i-1}{k-1}\).

\(g_{i,j}\) 除以2就是 \(i\) 个点,\(j\) 条边连通二分图数量,然后要求出 \(dp_{i,j}\) 为 \(i\) 个点, \(j\) 条边二分图数量,也是枚举 \(1\) 号点连通块大小 \(k\) 和边数 \(a\),\(dp_{i,j}\) 加上 \(g_{k,a}\times dp_{i-k,j-a}\times \binom{i-1}{k-1}\)。

最后要求序列数量,枚举他用了 \(k\) 种边,容斥掉用了不到 \(k\) 种边的情况就行了。

#include<bits/stdc++.h>
using namespace std;
const int N=35,P=998244353,M=1e6+5;
int n,m,g[N][N*N],f[N][N*N],dp[N][N*N],jc[M],iv[M],inv[M],ans;
int C(int n,int m)
{
	if(n<m)
		return 0;
	return 1LL*jc[n]*iv[m]%P*iv[n-m]%P;
}
int pown(int x,int y)
{
	if(!y)
		return 1;
	int t=pown(x,y>>1);
	if(y&1)
		return 1LL*t*t%P*x%P;
	return 1LL*t*t%P;
}
int main()
{
	iv[0]=iv[1]=inv[1]=jc[0]=jc[1]=1;
	for(int i=2;i<M;i++)
	{
		jc[i]=jc[i-1]*1LL*i%P;
		inv[i]=1LL*(P-P/i)*inv[P%i]%P;
		iv[i]=1LL*iv[i-1]*inv[i]%P;
	}
	scanf("%d%d",&n,&m);
	f[1][0]=g[1][0]=2;
	for(int i=2;i<=n;i++)
	{
		for(int j=0;j<=i*(i+1)/4;j++)
		{
			for(int k=0;k<=i;k++)
				(g[i][j]+=1LL*C(k*(i-k),j)*C(i,k)%P)%=P;
			f[i][j]=g[i][j];
			for(int k=1;k<i;k++)
			{
				for(int b=0;b<=k*(k+1)/4&&b<=j;b++)
				{
					f[i][j]+=P-1LL*f[k][b]*g[i-k][j-b]%P*C(i-1,k-1)%P;
					f[i][j]=f[i][j]>=P? f[i][j]-P:f[i][j];
				}
			}
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=0;j<=i*(i+1)/4;j++)
			f[i][j]=f[i][j]&1? f[i][j]+P>>1:f[i][j]>>1;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=i*(i+1)/4;j++)
		{
			dp[i][j]=f[i][j];
			for(int k=1;k<i;k++)
			{
				for(int b=0;b<=k*(k+1)/4&&b<=j;b++)
				{
					dp[i][j]+=1LL*f[k][b]*dp[i-k][j-b]%P*C(i-1,k-1)%P;
					dp[i][j]=dp[i][j]>=P? dp[i][j]-P:dp[i][j];
				}
			}
		}
	}
	for(int i=0;i<=n*(n+1)/4;i++)
	{
		int ret=0;
		for(int j=0;j<=i;j++)
			(ret+=pown(j,m)*1LL*C(i,j)%P*(i-j&1? P-1:1)%P)%=P;
//		printf("%d %d %d\n",i,dp[n][i],ret);
		(ans+=1LL*ret*dp[n][i]%P)%=P;
	}
	printf("%d",ans*1LL*pown(2,m)%P);
}

标签:二分,ABC327G,Good,个点,int,Many,times,条边,dp
From: https://www.cnblogs.com/mekoszc/p/17856744.html

相关文章

  • [ABC327D] Good Tuple Problem 题解
    分析:这一道题很容易发现可以用并查集来维护(不知道为什么其他人都用了图论),\(a_i\)与其对应的\(b_i\)代表着\(a_i\)这个集合里不能存在着\(b_i\)。根据只有存在两个集合,所以我们会发现,若\(x\)与\(y\)不在一个集合且\(x\)与\(z\)也不在一个集合,那么\(x\)和\(y\)......
  • 题解:Feel Good
    题目链接依然枚举每个位置作为最小值的情况,记录“值/下标”二元组,按第一维从大到小排序后,每次将第二位的位置在序列中标成\(1\),那么选择的一定是序列里一个\(1\)的极长段。加入一个位置检查其左右是否加入过,如果加入过就用并查集合并掉,同时维护极长段的和/左右端点是简单的,复......
  • frps: 2023/11/15 10:49:24 http: Accept error: accept tcp [::]:7650: accept4: too
    0.错误信息表明frps服务在接受传入连接时遇到了问题,特别是与端口7750相关的错误,具体错误为"accepttcp[::]:7750:accept4:toomanyopenfiles",意味着打开文件数目过多。这种错误通常发生在系统达到文件描述符的打开数目限制时。在类Unix操作系统中,每个进程都有同时可以......
  • [题解]AT_abc328_f [ABC328F] Good Set Query
    思路带权并查集模板。如果对于一个三元组\((a,b,c)\)如果它能够添加到\(S\)中一定满足如下条件中的一条:\(X_a,X_b\)满足其中有一个是「不确定」的。在这里\(X_i\)「不确定」指\(X_i\)没有与其它的任意\(X_j\)有关系。\(X_a,X_b\)有间接或直接的关系,但是能计算......
  • 深入理解 LINQ 中的 SelectMany
    在LINQ(LanguageIntegratedQuery)中,SelectMany是一个强大的方法,用于处理集合中的嵌套结构。本文将深入探讨SelectMany的用法,以及在其两种形式中参数的含义。1.SelectMany的单参数形式IEnumerable<TResult>SelectMany<TSource,TResult>(thisIEnumerable<TSource>source......
  • slice不改变原数组,返回截取的数组,slice(start,end), splice改变原数组splice(start,h
    执行以下程序,输出结果为()vara=[1,2,3];varb=a.slice();b.push(4);console.log(a)[1,2,3]array.slice(begin,end)将返回一个由begin和end决定的原数组的浅拷贝,其中,begin和end参数均是可选参数,如果省略begin,则默认从索引值为0开始提取,如果省略end,则默认提取到数组最后一......
  • D - Good Tuple Problem atcoder abc 327
    D-GoodTupleProblemhttps://atcoder.jp/contests/abc327/tasks/abc327_d 思路https://www.zhihu.com/question/292465499判断二分图的常见方法是染色法:用两种颜色,对所有顶点逐个染色,且相邻顶点染不同的颜色如果发现相邻顶点染了同一种颜色,就认为此图不为二分图当所......
  • .NET(C#) Linq Concat和Union以及Select和SelectMany的使用及区别
    1、Concat操作符Concat操作符用于连接两个序列,生成一个新序列。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication{classProgram{staticvoidMain(s......
  • abc327G
    很容易发现条件其实就是限制二分图。那么我们设\(F(n,m)\)表示\(n\)个点,\(m\)条边组成二分图的答案(非简单图)。那么答案可以发现是\(F(n,m)\cdot2^m\),\(2^m\)出自边的端点的两种顺序。现在来计算\(F(n,m)\)。我们这里的\(m\)很大,会达到\(1e9\)的级别,这时候很难用......
  • [ABC327G] Many Good Tuple Problems 题解
    题意对于一对长度均为\(M\)且元素值在\(\left[1,N\right]\)之间的序列\((S,T)\),定义其为好的当且仅当:存在一个长度为\(N\)的\(01\)序列\(X\),使得其满足如下条件:对于任意\(i\in\left[1,M\right]\),有\(X_{S_i}\neqX_{T_i}\)。给定\(N,M\),求在所有可......