题目
有$3$种颜色的点,分别有$a,b,c$个。你可以在任意两点之间连边,问:有多少种连边的方法,使得相同颜色的点的最小距离不小于$3$。答案对一个质数取模。
数据范围
$1\le a,b,c\le 5000$
做法
切入点:相同颜色的点的最小距离大于等于$3$,意味着同色点的距离不为$1$,也不为$2$。不为$1$表示相同颜色的点之间不能连边。不为$2$表示,对于任意一点,向某种不同颜色的点集连的边只能为$0$或者$1$条。所以,只要计算任意两种不同颜色之间连边的方案数,再乘起来,就是答案。
直接算
对于两种颜色,分别有$a,b(a \le b)$个点的点集之间,连$i$条边的方案数为$C_a^iC_b^ii!$。解释就是:在$a$个点中选$i$个点,在$b$个点中选$i$个点,作为$i$条边的端点,点选完之后,不同的连法有$i!$个,相当于固定$a$中所选的$i$个点,$b$中所选的$i$个点有多少种方法与$a$中的$i$个点对应,显然有$i!$种。所以,总的方案数为$ \sum_{ i =0 } ^a C_a^i C_b^i i!$。
DP递推
$dp[i][j]:=$两种颜色的点分别有$i$和$j$个,满足条件的连边的方案数。
对于$dp[i+1][j]$,考虑新增加的那个点的贡献:(1)连边时未用到新加的点,有$dp[i][j]$种。(2)用到了新加的点,在$j$中选择一个点和它相连,其余的点有$dp[i][j-1]$种,所以这种情况有$j\times dp[i][j-1]$种。所以,$DP$方程为:$dp[i+1][j]=dp[i][j]+j\times dp[i][j-1]$。边界条件为:$dp[0][i]=dp[i][0]=1$。
代码
直接算
|
|
DP递推
|
|