个人思路:

一棵树也只有一个 \(a=-1\) 的点,所以可以把它看做一个点,但是要记录点的大小 \(sz_i\),即为这棵树的大小。如果本来就是一个点,那么大小为 \(1\)。

状态:\(dp_{i,j}\) 表示前 \(i\) 个点已确定,已产生 \(j\) 个连通块的方案数。

转移:\(dp_{i,j} = dp_{i-1,j-1} \times sz_i + dp{i-1,j} \times (n-sz_i)\)。

这个状态如果选择了后面的点,会直接影响后面的点的大小,不可做。

然后就不会了。

正解:

设 \(a=-1\) 的点共有 \(m\) 个。

\(k\) 个点 \(x_1,x_2,\dots ,x_k\) 构成一个环,有 \((k-1)! \times \prod\limits_{i=1}^k sz_{x_i}\) 种方案数,因为每个点下一个连接的点形成的排列有 \((k-1)!\) 种,而每个点中有 \(sz_i\) 种选择。

剩下的随便选,每种环在所有方案中出现了 \(n^{m-k}\) 次。那么这 \(k\) 个点构成的环对答案的贡献为 \((k-1)! \times \prod\limits_{i=1}^k sz_{x_i} \times n^{m-k}\)。

显然,我们可以把任选 \(k\) 个点的 \(sz_i\) 乘积之和算出来,可以 \(\Theta(n^2)\) 递推,具体看代码。

[ARC140D] One to One的更多相关文章

随机推荐

  1. 找出一组数中出现次数最多的数(csp201312-1)

    问题描述:找出一组数字出现次数最多的数,如果有多个这样的数,输出其中最小的一个. 算法:sort排序,遍历数组,每遍历一个数,查出它已经出现的次数. 代码: #include<bits/stdc ...

  2. C++数组(一):一维数组

    C++一维数组 C++数组的定义方式 数据类型 数组名[数组长度]; 例子:int arr[3]; arr[0] = 1; arr[1] = 2; arr[2] = 3; 数据类型 数组名[数组长度] ...

  3. apk文件查看指纹证书方法

    1. 先将apk文件重命名为zip文件 2. 解压zip到指定一个文件夹下,其中的META-INF/CERT.RSA文件即MD5签名文件 3. cmd下打开窗口,输入如下命令: keytool -pr ...

  4. MAC系统连接Windows共享文件的方法:

    MAC系统连接Windows共享文件的方法: 1.首先先确认Windows系统下已开启共享.并且两台电脑之间局域网已通. 2.苹果MAC系统,点击桌面.打开顶部菜单 "前往". 3 ...

  5. 地理信息技术GIS学习(3):数据表操作、图表制作、地图编辑(上海市行政区划图)

    数据表操作.图表制作内容主要来自 张明明的<ArcGis 10.1 超级学习手册>,其博客的电子数据已经找不到. 一.数据表操作 ArcMap中以属性表的形式来组织和管理要素的属性信息.每 ...

  6. Linux系统Shell脚本第三章:for、while循环及脚本实操

    目录 一.echo命令 二.查看当前系统的时间-date命令 三.for循环语句 四.while循环语句结构(迭代) 五.until 循环语句结构 六.continue和break 一.echo命令 ...

  7. JVM相关总结

    https://www.cnblogs.com/jiangym/p/15885161.html JVM内存模型(JMM) 根据代码画出下面的JVM内存模型 public class Math { pu ...

  8. Web安全与渗透测试笔记

    Web安全与渗透测试笔记 @author: lamaper 一.基本网络知识 (一)网络是怎样联通的 TCP/IP协议 Internet Http协议 (二)Http协议 http请求 一个完整的Ht ...

  9. python接口测试常见问题。

    一.入参问题 1.body字段类型 1.如果数据是从excel提取的那么中文数据会提示错误. 解决方法# media_value['body'] = media_value['body'].encod ...

  10. 冒泡排序快速排序C语言

    //冒泡排序 void BubbleSort(ElemType A[], int n) { int i, j, temp; int flag=1; for (i = 1; i <= n - 1& ...