首页 > 其他分享 >【题解 ABC180F】 Unbranched

【题解 ABC180F】 Unbranched

时间:2023-11-17 09:12:19浏览次数:33  
标签:605 Unbranched 题解 样例 long times leq ABC180F mod

[ABC180F] Unbranched

题面翻译

求 \(N\) 个点,\(M\) 条边且满足以下条件的图的数量:

  • 图中无自环;

  • 每个点度数最多为 \(2\);

  • 连通块大小的最大值恰好为 \(L\)。

答案对 \(10^9+7\) 取模。

\(2\le N\le300\),\(1\le M,L\le N\)。

题目描述

頂点にラベルが付き辺にはラベルが付いていない $ N $ 頂点 $ M $ 辺の単純とも連結とも限らないグラフであって、以下の条件を満たすものの個数を $ 10^9+7 $ で割ったあまりを求めてください。

  • 自己ループを持たない
  • すべての頂点の次数が $ 2 $ 以下である
  • 各連結成分のサイズを並べたとき、その最大値がちょうど $ L $ である

输入格式

入力は以下の形式で標準入力から与えられる。

$ N $ $ M $ $ L $

输出格式

答えを出力せよ。

样例 #1

样例输入 #1

3 2 3

样例输出 #1

3

样例 #2

样例输入 #2

4 3 2

样例输出 #2

6

样例 #3

样例输入 #3

300 290 140

样例输出 #3

211917445

提示

制約

  • $ 2\ \leq\ N\ \leq\ 300 $
  • $ 1\leq\ M\ \leq\ N $
  • $ 1\ \leq\ L\ \leq\ N $
  • 入力はすべて整数

Sample Explanation 1

頂点に $ 1 $ から $ N $ の番号を付けたとき、以下の $ 3 $ 通りのグラフが条件を満たします。 - $ 1-2 $ 間と $ 2-3 $ 間に辺がある。 - $ 1-2 $ 間と $ 1-3 $ 間に辺がある。 - $ 1-3 $ 間と $ 2-3 $ 間に辺がある。

解题思路

看到计数题我们就可以用 \(DP\) 来解决。
钦定最大为 \(L\) 很麻烦,我们可以设计函数 \(ans(n,m,l)\) 表示满足题目要求的 \(n\) 点 \(m\) 边,最大连通块节点个数不超过 \(l\) 的图的个数,那么答案就为 \(ans(n,m,l)-ans(n,m,l-1)\) 。
对于每次求解 \(ans(n,m,l)\) ,就采取 \(DP\) 的方式。
根据题目要求,一个连通块只有两种可能形式,圆与链,设点数为 \(x\) ,边数分别为 \(x\) 与 \(x-1\)。
每种链有 \(x!\) 种可能构造形式,因为链翻转过来会有重复,所以我们要除以 \(2\) ,即为 \(\frac{k!}{2}\) 。
每种圆与每种链基本同理,但因为圆还可以旋转,所以为 \(\frac{(k-1)!}{2}\) 。
注意,圆只有两个点时不可旋转。
设 \(f_{i,j}\) 表示 \(i\) 点 \(j\) 边的方案数,从 \(f_{i-k,j-k}\) 与 \(f_{i-k,j-k+1}\) 转移而来,从 \(n-i+k\) 中选 \(k\) 个点,即为 \(C_{n-i+k}^{k}\),但会有重复,我们可以利用选取一个基准点进行统计的思想,让当前最小的点一定进此连通块,为 \(C_{n-i+k-1}^{k-1}\) 。
综上,转移方程为:

\[f_{i,j}=\begin{cases} f_{i-k,j-k} \times C_{n-i+k-1}^{k-1} \times \frac{(k-1)!}{2} \\ f_{i-k,j-k+1} \times C_{n-i+k-1}^{k-1} \times \frac{k!}{2} \end{cases} \]

初始值 \(f_{0,0}=1\) ,答案为 \(f_{n,m}\) 。
时间复杂度 \(O(nml)\) 。

Code

#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline") 
using namespace std;
const long long mod=1e9+7;
long long n,m,c[605][605],a[605],mod_2,f[605][605];
long long dijah(long long x,long long y)
{
	long long h=1;
	while(y)
	{
		if(y&1)
		{
			h*=x;
			h%=mod;
		}
		x*=x;
		x%=mod;
		y>>=1;
	}
	return h;
}
long long gaia(long long k)
{
	memset(f,0,sizeof(f));
	f[0][0]=1;
	long long q;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			f[i][j]=f[i-1][j];
			for(int u=2;u<=k;u++)
			{
				if(u<=i&&u<=j)f[i][j]+=((f[i-u][j-u]*c[n-i+u-1][u-1]%mod)*(u>2?(a[u-1]*mod_2%mod):1)),f[i][j]%=mod;
				if(u<=i&&u-1<=j)f[i][j]+=((f[i-u][j-u+1]*c[n-i+u-1][u-1]%mod)*(a[u]*mod_2%mod)),f[i][j]%=mod;
			}
		}
	}
	return f[n][m]; 
}
int main()
{
	long long k;
	c[0][0]=1;
	for(int i=1;i<=600;i++)
	{
		c[i][0]=1;
		for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
	}
	a[0]=1;
	for(int i=1;i<=600;i++)a[i]=(a[i-1]*i)%mod;
	mod_2=dijah(2,mod-2);
	scanf("%lld%lld%lld",&n,&m,&k);
	printf("%lld",((gaia(k)-gaia(k-1))%mod+mod)%mod);








  return 0;
}

标签:605,Unbranched,题解,样例,long,times,leq,ABC180F,mod
From: https://www.cnblogs.com/dijah/p/17837837.html

相关文章

  • 题解 P7972【[KSN2021] Self Permutation】
    怎么其他两篇题解都是\(O(n\logn)\)的,来发一个\(O(n)\)做法,当考前复习了。对原序列建出小根笛卡尔树,节点编号与原序列中的下标相同。记\(T_u\)表示以\(u\)为根的子树,\(lc(u),rc(u)\)分别表示\(u\)的左儿子和右儿子。设\(f_u\)表示删除若干\(T_u\)中的点(可以不删......
  • [ARC106F] Figures 题解
    题意给定\(N\)个带有若干洞的节点,其中第\(i\)个点上有\(d_i\)个洞。先可以在两个不同的节点的洞之间连边,一个洞最多连一条边,求使得最终形成的图是一棵树的方案数,对\(998244353\)取模。洞之间相互区分,两个方案不同当且仅当存在一条边在两个方案中的连的洞不同。\(2\l......
  • P9400 题解
    blog。很naive的题,写这篇题解,主要是现有题解都用的线段树/平衡树,让我感到很难绷。一眼DP。\(dp_{i,j}\)表示前\(i\)个宿舍,现在有连续\(j\)个灯亮大于\(B\),方案数。\(dp_{i,0}=\max(\min(B,r_i)-l_i+1,0)\cdot\sum\limits_{j=0}^{A-1}dp_{i-1,j}\)。\(dp_{i......
  • CF8E 题解
    blog。抽象意义上单杀了。首先第一位必定为\(0\),然后取反串就不用去考虑了。\(n\le50\),考虑爆搜。搜整个串的前一半(设半长为\(M=\left\lfloor\dfracn2\right\rfloor\),前一半的串在十进制下值为\(v\)),后半段的数量可以计算:整个串最后一位是\(0\),只需满足逆序串。\(n\)为......
  • P7701 [CCC2014] 提前交卷 题解
    目录DescriptionSolutionCodeDescription在一个教室里有\(n\)排座位,每排有\(6\)个,从左至右标号分别为ABCDEF,其中C和D中有过道,通往教室前端和后端的两个房间,每个房间最开始没有人,每个座位上开始都有人。有\(m\)个不同的学生会依次提前交卷,先从这一排走到过道上,在从......
  • 鼠标拖拽拖动盒子时,与盒子内某些点击事件冲突问题解决
    问题:拖动时会触发圆球的点击事件解决鼠标拖动盒子时,将moving设为true意为正在拖动盒子,此时将class="move"遮挡容器展示在悬浮球上层,以覆盖悬浮球,此时也就不存在触发悬浮球点击事件的冲突了;鼠标拖动完盒子弹起时再将 moving设为false意为不在拖动盒子(遮挡容器class=......
  • C++调用Python3实战,和PyImport_ImportModule返回NULL问题解决
    LinuxC++调用Python3入门准备以下面的目录结构演示如何在LinuxC/C++调用python3。|--hello.py|--main.cpp|--CMakeLists.txt hello.py:python的脚本,里面有2个函数main.cpp:c++函数CMakeLists.txt:Cmake文件,生成makefilepython脚本示例python脚本hello.py内容如下,......
  • 赛前集训11天题解大总
    Day1kitty核心思路:将转移过程中的方案加入转移矩阵,边转移边累加stringdp设计:\(f[i][x][y]\)表示长度为\(i\),第一段以\(x\)结尾,且\(x\leqslantp\),第二段以\(p\)开头,以\(y\)结尾的两段完全相同的序列的对数。对于每个\(p\)答案就是\(\sum_{i=1}^{n}i\cdotf[i][x......
  • 题解:Feel Good
    题目链接依然枚举每个位置作为最小值的情况,记录“值/下标”二元组,按第一维从大到小排序后,每次将第二位的位置在序列中标成\(1\),那么选择的一定是序列里一个\(1\)的极长段。加入一个位置检查其左右是否加入过,如果加入过就用并查集合并掉,同时维护极长段的和/左右端点是简单的,复......
  • 【洛谷 P2141】[NOIP2014 普及组] 珠心算测验 题解(集合+多重循环)
    [NOIP2014普及组]珠心算测验题目描述珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合......