首页 > 其他分享 >洛谷 P6862 [RC-03] 随机树生成器 绿 题解

洛谷 P6862 [RC-03] 随机树生成器 绿 题解

时间:2022-08-29 21:23:22浏览次数:96  
标签:03 个点 int 题解 inv 生成器 jc 节点 mod

前言

模数要模 \(1e9+9\)!!模数要模 \(1e9+9\)!!模数要模 \(1e9+9\)!!

结论

\(n\) 个点的树的形态有 \((n-1)!\) 个,对于节点 \(k\),它的所有度数和为 \((n-1)!\left(\sum\limits_{j=k+1}^n \dfrac{1}{j-1} + [k \not= 1] \right)\)

理论基础

树的形态

我们先说为什么 \(n\) 个点的树的形态有 \((n-1)!\) 种。

对于第 \(1\) 个点,加入后只有 \(1\) 种形态,且它是根节点,这是显然的。

对于第 \(2\) 个点,只能认 \(1\) 这个节点为爹,所以只有 \(1\) 种形态。

对于第 \(3\) 个点,能认的爹有 \(1\) 或者 \(2\),所以总共有 \(2\) 种形态。

对于第 \(4\) 个点,对于之前两种形态的每一种,能认的爹有 \(1\) 或 \(2\) 或 \(3\),所以总共有 \(2 \times 3\) 种形态。

我相信到这里你已经发现了其中的规律了!

对于第 \(i\) 个点,加入后树总共有 \((i-1)!\) 种。

所以 \(n\) 个点的树的形态有 \((n-1)!\) 种。

度数和

再来看为什么答案是 \((n-1)!\left(\sum\limits_{j=k+1}^n \dfrac{1}{j-1} + [k\not= 1] \right)\)

我们将这个式子拆成两部分:\((n-1)! \sum\limits_{j=k+1}^n \dfrac{1}{j-1}\) 和 \((n-1)! [k \not= 1]\)

我们先看较为简单的第二部分,度数=父亲节点数量+儿子节点数量,因为这是一棵树,所以每个非根节点有且只有一个父亲,根节点没有父亲,这就是公式第二部分的由来。

对于第一部分,对于每个点 \(k'\ (k < k' \le n)\),它会在 \(1 \sim k'-1\) 中任意挑选一个爹,所以挑到点 \(k\) 当爹的概率自然是 \(\dfrac{1}{k'-1}\)。

细节处理

观察公式发现我们需要快速求出阶乘,这个很简单;还要快速求出逆元,这个用快速幂的话就超时了,所以用线性求逆元,不懂线性求逆元的可以戳我

Code

#include <iostream>
#include <cstring>

using namespace std;

typedef long long LL;

const int N = 1e7 + 31;
const LL mod = 1e9 + 9;

int T, n, k;
LL inv[N], jc[N];

void init()
{
	inv[1] = 1;
	for (int i = 2; i < N; i ++ )
		inv[i] = (mod - mod / i) * inv[mod % i] % mod;
	for (int i = 2; i < N; i ++ ) inv[i] = (inv[i] + inv[i - 1]) % mod;
	jc[1] = 1;
	for (int i = 2; i < N; i ++ ) jc[i] = i * jc[i - 1] % mod;
	return;
}

int main()
{
	cin >> T;
	init();
	while (T -- )
	{
		cin >> n >> k;
		LL ans;
		if (k == 1) ans = (inv[n - 1] - inv[k - 1] + mod) % mod;
		else ans = (inv[n - 1] - inv[k - 1] + 1 + mod) % mod;
		ans = (ans * jc[n - 1]) % mod;
		cout << ans << endl;
	}
}

后语

概率/期望是真难,一天就做了俩绿题……

完结撒花,收~

标签:03,个点,int,题解,inv,生成器,jc,节点,mod
From: https://www.cnblogs.com/LittleMoMol-kawayi/p/solution_LuoGu_P6862.html

相关文章

  • python基础-生成器,列表推到式
    python基础-生成器,列表推到式 一. 生成器什么是生成器?.生成器实质就是迭代器.在python中有三种方式来获取生成器:通过生成器函数通过各种推导式来实......
  • Day03下载配置java环境以及如何删除java文件
    卸载JDK删除java的安装目录删除JAVA_HOME删除path下关于java的目录java-version安装JDK百度搜索JDK8,找下载地址同意下载协议下载电脑对应版本......
  • 0032-Rust-自实现迭代器
    环境Time2022-05-21Rust1.61.0前言说明参考:https://doc.rust-lang.org/std/iter/index.html目标接前一节,在迭代的过程中,修改每个迭代的元素。自定义类型#[der......
  • [Atcoder]ABC266题解
    C-ConvexQuadrilateral计算几何给定平面内四个点,要求判断它们组成的四边形是否是凸四边形法一:凸四边形的两条对角线将其分成两个三角形分成的两个三角形面积相加......
  • 0033-Rust-实现递归迭代
    环境Time2022-05-21Rust1.61.0前言说明参考:https://fasterthanli.me/articles/recursive-iterators-rust目标对于递归类型的结构,实现递归迭代。自定义类型str......
  • Unrecognised input. Possibly missing opening '{'
    引入element-plus样式文件时报错Unrecognisedinput.Possiblymissingopening'{' 配置webpack时,如果是这样写的:css文件使用css-loader解析器修改 ......
  • [POJ1062]昂贵的聘礼题解
    [POJ1062]昂贵的聘礼题目链接【题目大意】现有n个物品,每个物品价格为vi,同时可以用其他物品减免价格(当然,你必须拥有该物品).问如何购买可以使得到物品1的花费最少.此外,还......
  • CF1455G Forbidden Value 题解
    CF1455GForbiddenValue已知初始值\(x=0\),给定下面2种命令:set\(y\)\(v\),令\(x=y\),或花费\(v\)元钱删除该命令;if\(y\)...end,如果\(x==y\),执行if...end中的命令,否......
  • Discuz论坛网站favicon图标更改方法 (2014-03-08 11:05:59)
    先制作一个网站的favicon.ico,百度搜索favicon在线制作可以找到很多的网站提供在线制作[推荐:http://www.ico.la/],favicon是ico格式的,你可以把你的图标在线制作什么ico,官方的......
  • Java List集合返回值去掉中括号('[ ]')的操作
    调用StringUtils工具类的strip()方法去掉中括号"[]": 或者自己写工具类publicstaticvoidmain(String[]args){Strings="[aasa,bbbbb]";Strings......