题解

可以说是什么找规律好题了

但是要推生成函数,非常神奇……

任何的一切都可以用\(n^2\)dp说起

我们所求即是 所有树的叶子总数/所有树的方案数

我们可以列出一个递推式,设\(g(x)\)为\(x\)个节点构成的树的总数

那么有

\(g(n) = \sum_{i = 0}^{n - 1}g(i) * g(n - 1 - i)\)

很好理解,就是枚举左右子树的节点个数,拼出一个根节点

特殊是\(g(0) = 1\)

设\(f(x)\)为\(x\)个节点构成的树的叶子总数

\(f(n) = 2\sum_{i = 0}^{n - 1}f(i) * g(n - 1 - i)\)

就是用i个节点当左子树或者右子树,乘上另一子树的方案数,就是叶子被计入的次数

特殊的是\(f(1) = 1\)

哎?可是复杂度是\(n^2\)?怎么办?

我们用生成函数!

\(f(x) = \sum_{i = 0}^{+\infty}f(i)x^{i}\)

\(g(x) = \sum_{i = 0}^{+\infty}g(i)x^{i}\)

有什么用啊?难道可以分治FFT?

数据范围1e9啊……gg

由于\(g(x)\)和\(f(x)\)的递推都是卷积形式,我们尝试用卷积表示两个函数,可以得到两个方程

\(g(x) = g^{2}(x) + 1\)

\(f(x) = 2f(x)g(x) + x\)

后面的小尾巴是怎么来的?注意看我上面说的特殊点\(g(0) = 1\)和\(f(1) = 1\)

运用初中数学的一元二次方程解法,我们可以得到

\(g(x) = \frac{1 - \sqrt{1 - 4x}}{2x}\)(为什么只取一个符号,等会看下面写的)

\(f(x) = \frac{x}{\sqrt{1-4x}}\)

解出来之后,发现这个东西十分的不优美,我们是生成函数哎??为什么没有一个整数指数幂呢?我们需要的是对应指数幂前的系数啊

然后怎么办啊?

暴力泰勒展开

我们先求一下\(f(x)\)和\(g(x)\)的关系吧

根据敏锐的直觉我们发现

\(f(x)\)和\(g(x)\)一定是有关系的!

而且更神奇的是…………………………

………………………………………………

………………………………………………

\(\int \frac{f(x)}{x}dx = -\frac{1}{2}\sqrt{1 - 4x} + C= xg(x)\)

啥啥啥?我刚上幼儿园还不会导数不会积分呐qwqqqqq

你需要一本高中数学选修2-2!

我们知道微积分基本定理是,如果对于

\(f(x) = F'(x)\)

那么\(\int f(x) dx = F(x) + C\)

很好理解,就是,对于积分的变化率就是原来的函数嘛

同时,\(\frac{f(x)}{x} = \frac{1}{\sqrt{1-4x}}\)

我们需要找到一个函数的导数,正好是这个数\(\frac{1}{1-4x}\)

也就是\(F'(x) = \frac{1}{1-4x}\)

怎么找呢,先愉快换一波元

\(t = 1 - 4x\)

\(F'(x) = \frac{1}{\sqrt{t}}\)

噫,好!这个我会

\(F(x) = 2 t^{\frac{1}{2}}\)

……

所以这个\(F(x)\)里的\(x\)呢

把t换回去??are you sure?

我们好好看看高中选修2-2

明确讲述了,如何求一个\(f(g(x))\)的导数

首先设\(u = g(x),y = f(x)\)

那么\(f(g(x)) = \frac{\Delta y}{\Delta x} = \frac{\Delta y}{\Delta u} \cdot \frac{\Delta u}{\Delta x}\)

那么就很明确了\(f(g(x)) = g'(x)f'(g(x))\)

现在的话,我们重新求一遍

发现\(F'(x) = -\frac{1}{2} \cdot (-4) \cdot \frac{1}{2} t^{-\frac{1}{2}}\)

那么\(F(x) = -\frac{1}{2} t^{\frac{1}{2}} + C\)(C是常数,可以是任意大小)

哎?这个东西有点像……

\(xg(x) = \frac{1 - \sqrt{1-4x}}{2} = -\frac{\sqrt{1-4x}}{2} + \frac{1}{2}\)

妙啊

那么我们会发现,积分的导数就是原来的函数……即……

\(\frac{\mathrm{d} }{\mathrm{d} x} xg(x) = \sum_{i = 0}^{+\infty} (i + 1) g(i)x^{i} = \frac{f(x)}{x}\)

那么\(f(x) = \sum_{i = 0}^{\infty} (i + 1)g(i)x^{i + 1}\)

\(f(n) = n g(n - 1)\)

好了,现在我们要求的东西就剩下\(g(x)\)了

让我们来暴力优雅的泰勒展开

\(h(x) = xg(x) = \frac{1 - \sqrt{1 - 4x}}{2}\)

我们求一个\(\sqrt{1 + y}\)的导数

\(h^{(1)}(y) = \frac{1}{2} (1 + y)^{-\frac{1}{2}}\)

\(h^{(2)}(y) = \frac{1}{2} (\frac{1}{2} - 1) (1 + y)^{-\frac{3}{2}}\)

\(h^{(k)}(y) = \prod_{i = 0}^{k - 1}(\frac{1}{2} - i) (1 + y)^{\frac{1}{2} - k}\)

然后在\(y = 0\)处展开

\(\sqrt{1 - 4x} = \sum_{i = 0}^{+\infty} \frac{\prod_{k = 0}^{i - 1} (\frac{1}{2} - k)}{k!} (-4x)^{k}\)

我们发现这些东西的系数都是负的,但是方案数是正整数,这就是为什么这个东西选择前面是负号而不是正号

设\(\begin{bmatrix}
\frac{1}{2}\\
k
\end{bmatrix} = \frac{\prod_{i = 0}^{k - 1} (\frac{1}{2} - i)}{k!}\)

那么

\(h(x) = \frac{1 - (1 + \sum_{k = 1}^{+\infty} \begin{bmatrix}\frac{1}{2}\\k \end{bmatrix} (-4x)^{k} )}{2}\)

我们除掉一个x

\(g(x) = \frac{-\sum_{k = 1}^{+\infty} \begin{bmatrix}\frac{1}{2}\\k \end{bmatrix} (-4)^{k}x^{k - 1}}{2}\)

我们对于第\(k\)项求一下系数

\(A_k = -\frac{\prod_{i = 0}^{k} (\frac{1}{2} - i) (-4)^{k + 1}}{2(k + 1)!}\)

\(A_k = \frac{(-1)^{k + 2} 2^{2k + 1} \prod_{i = 0}^{k} (\frac{1}{2} - i)}{(k + 1)!}\)

我们把-1的指数减掉2,分配给每个乘积里的数,然后把2分配进乘积里

\(A_k = \frac{2^{k} \prod_{i = 1}^{k} (2i - 1)}{(k + 1)!}\)

\(A_k = \frac{\prod_{i = 1}^{k}(2i - 1) \prod_{i = 1}^{k}2i}{k!(k + 1)!}\)

\(A_k = \frac{1}{k + 1} \binom{2k}{k}\)

而\(\binom{2k}{k}\)就是我们很熟悉的卡特兰数了

这样的话

我们只要

固输\(\frac{n(n + 1)}{2(2n - 1)}\)就可以得满分了。

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <cmath>
#include <bitset>
#include <queue>
#define enter putchar('\n')
#define space putchar(' ')
//#define ivorysi
#define pb push_back
#define mo 974711
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define MAXN 100005
#define eps 1e-12
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 - '0' + c;
c = getchar();
}
res = res * f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
db N;
void Solve() {
scanf("%lf",&N);
N = N * (N + 1) / (2 * (2 * N - 1));
printf("%.9lf",N);
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

【LOJ】#2105. 「TJOI2015」概率论的更多相关文章

  1. 「TJOI2015」概率论 解题报告

    「TJOI2015」概率论 令\(f_i\)代表\(i\)个点树形态数量,\(g_i\)代表\(i\)个点叶子个数 然后列一个dp \[ f_i=\sum_{j=0}^{i-1} f_j f_{i-j ...

  2. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  3. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  4. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  5. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  6. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  7. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  8. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  9. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

随机推荐

  1. HashMap源码分析-基于JDK1.8

    hashMap数据结构 类注释 HashMap的几个重要的字段 hash和tableSizeFor方法 HashMap的数据结构 由上图可知,HashMap的基本数据结构是数组和单向链表或红黑树. 以 ...

  2. 2017 清北济南考前刷题Day 4 morning

    考场思路: 倒着算就是 可以对一个数-1 可以合并两个数 可以证明只有0和0才能执行合并操作 然后模拟 #include<cstdio> #include<iostream> ...

  3. uploadify IE11 不兼容问题(不显示图片)

    1.进入uploadify官网demo  :  http://www.uploadify.com/demos/ 2.  显示   (确认flash为最新版本) 3.更换其它浏览器一切正常 4.原因:I ...

  4. Java并发编程原理与实战三十五:并发容器ConcurrentLinkedQueue原理与使用

    一.简介 一个基于链接节点的无界线程安全队列.此队列按照 FIFO(先进先出)原则对元素进行排序.队列的头部 是队列中时间最长的元素.队列的尾部 是队列中时间最短的元素.新的元素插入到队列的尾部,队列 ...

  5. dup()&dup2()

    [dup()&dup2()] 都是复制文件描述符指针.dup2可以指定复制到哪一个新索引. 参考:http://hi.baidu.com/flikecn/item/e82e14bef06e8a ...

  6. PHP autoload自动加载机制

    原文地址: http://www.jb51.net/article/31399.htm 一直不是很明白__autoload()和spl_autoload_register()到底有什么不同,找到了一个 ...

  7. [转]softmax函数详解

    答案来自专栏:机器学习算法与自然语言处理 详解softmax函数以及相关求导过程 这几天学习了一下softmax激活函数,以及它的梯度求导过程,整理一下便于分享和交流. softmax函数 softm ...

  8. css的盒模型手机端兼容写法应该是啥样的呢?

    前言:刚刚接触css3的盒模型,感觉对于解决水平垂直居中.固定宽度/高度和可变宽度/高度同时存在这样的问题很有效.但是最近在看一个腾讯手机端框架(Frozen UI )的时候发现一个很神奇的多行文字截 ...

  9. PCA主成分分析理解

    一.理论概述 1)问题引出 先看如下几张图: 从上述图中可以看出,如果将3个图的数据点投影到x1轴上,图1的数据离散度最高,图3其次,图2最小.数据离散性越大,代表数据在所投影的维度上具有越高的区分度 ...

  10. java8中对lamdba表达式方法参数传递时,方法重载之后的类型推断

    java8中可以向方法传递一个lamdba表达式,今天看书关于类型推断碰到一个问题: 这个问题我实际操作了一下:得出结论 如果是只有一个方法的情况下,方法参数使用lamdba表达式的时候是不需要写类型 ...