并不对劲的bzoj4001:loj2105:p3978:[TJOI2015]概率论

题目大意

随机生成一棵\(n\)(n\leq10^9)个节点的有根二叉树,问叶子结点个数的期望。

题解
subtask 1:\(n\leq100\),70pts

结论:不同的\(n\)个节点的有根二叉树有\(\frac{C_{2\times n}^{n}}{n+1}\)(也就是卡特兰数)个。
设\(f(i)\)表示\(i\)个节点的有根二叉树期望有几个叶子结点。
计算\(f(i)\)时考虑除根以外\(i-1\)个节点哪些放左边,哪些放右边。\(\Theta(n^2)\)。

subtask 2:\(n\leq 10^9\),30pts

将\(f(i)\times \frac{C_{2\times n}^{n}}{n+1}\)打表,得:1,2,6,20,70,252……
也就是:\(1\times 1,2\times 1,3\times 2,4\times 5,5\times 14,6\times 42,.....\)
有:\(f(i)\times \frac{C_{2\times n}^{n}}{n+1}=i\times \frac{C_{2\times (n-1)}^{n-1}}{n}\)
\(f(i)=\frac{i\times f(i)\times \frac{C_{2\times (n-1)}^{n-1}}{n}}{\frac{C_{2\times n}^{n}}{n+1}}=\frac{i\times(i+1)}{2\times (2\times i-1)}\)

代码
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define view(u,k) for(int k=fir[u];~k;k=nxt[k])
#define LL long long
#define D double
using namespace std;
int read()
{
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)&&ch!='-')ch=getchar();
    if(ch=='-')f=-1,ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    return x*f;
}
void write(int x)
{
    if(x==0){putchar('0'),putchar('\n');return;}
    int f=0;char ch[20];
    if(x<0)putchar('-'),x=-x;
    while(x)ch[++f]=x%10+'0',x/=10;
    while(f)putchar(ch[f--]);
    putchar('\n');
    return;
}
int n;
//D g[107],f[107];
int main()
{
    n=read();
    /*f[0]=0,g[0]=g[1]=f[1]=1;
    rep(i,2,n)
    {
        rep(j,0,i-1)g[i]+=g[j]*g[i-j-1];
        rep(j,0,i-1)f[i]+=g[j]*g[i-j-1]/g[i]*(f[j]+f[i-j-1]);
    }
    */
    printf("%.9lf",n*(n+1.0)/2.0/(2.0*n-1.0));
    return 0;
}
一些感想

学习卡特兰数中……

原文地址:https://www.cnblogs.com/xzyf/p/11317865.html

时间: 2024-10-08 20:13:37

并不对劲的bzoj4001:loj2105:p3978:[TJOI2015]概率论的相关文章

LG P3978 [TJOI2015]概率论

题意描述 为了提高智商,ZJY开始学习概率论.有一天,她想到了这样一个问题:对于一棵随机生成的\(n\)个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢? 判断两棵树是否同构的伪代码如下: \(\text{CHECK}(T1,T2):\) \(//\text{两棵树的节点}T1,T2\) \(\mathbf{if}\ T1=\mathbf{NULL}\ \mathbf{or}\ T2=\mathbf{NULL}:\) \(\quad \mathbf{return

Luogu P3978 [TJOI2015]概率论

Link 设\(f_n\)表示\(n\)个点的不同构的二叉树个数,\(g_n\)表示\(n\)个点的不同构的二叉树的叶节点数之和. 可以得到\(g_n=nf_{n-1}\). 证:每棵\(n-1\)个点的二叉树有\(n\)个位置可以挂上一个叶节点进而得到\(n\)个点的二叉树. 我们知道\(f_n=C_n=\frac{2n\choose n}{n+1}\),因此\(ans=\frac{g_n}{f_n}=\frac{nf_{n-1}}{n}=\frac{2(n+1)}{4n-2}\). #inc

4001: [TJOI2015]概率论

4001: [TJOI2015]概率论 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 262  Solved: 108[Submit][Status][Discuss] Description Input 输入一个正整数N,代表有根树的结点数 Output 输出这棵树期望的叶子节点数.要求误差小于1e-9 Sample Input 1 Sample Output 1.000000000 HINT 1<=N<=10^9 Source 题解:首先给

BZOJ4001 [TJOI2015]概率论

Description Input 输入一个正整数N,代表有根树的结点数 Output 输出这棵树期望的叶子节点数.要求误差小于1e-9 Sample Input 1 Sample Output 1.000000000 HINT 1<=N<=10^9 题解 令$f_i$表示n个点无标号二叉树个数,那么枚举根的左子树的点数,可以得到 $$f_n = [n=0] + \sum_{i = 0}^{n - 1} f_if_{n-i-1}$$ (一眼看过去就是卡特兰数,但是现在暂时用不到) 再令$g_i

bzoj 4001 [TJOI2015]概率论 数学

4010: [HNOI2015]菜肴制作 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=4001 Description Input 输入一个正整数N,代表有根树的结点数 Output 输出这棵树期望的叶子节点数.要求误差小于1e-9 Sample Input 1 Sample Output 1.000000000 HINT 1<=N<=10^9 题意

BZOJ 4001 [TJOI2015]概率论 ——找规律

题目太神了,证明还需要用到生成函数. 鉴于自己太菜,直接抄别人的结果好了. #include <map> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i

[TJOI2015]概率论[卡特兰数]

题意 \(n\) 个节点二叉树的叶子节点的期望个数. \(n\leq 10^9\) . 分析 实际询问可以转化为 \(n\) 个点的不同形态的二叉树的叶子节点总数. 定义 \(f_n\) 表示 \(n\) 个节点的二叉树的个数, \(g_n\) 表示 \(n\) 个节点的不同形态的二叉树的叶子节点总数. 设一棵 \(n\) 个节点的树有 \(m\) 个叶子节点,每删去一个叶子节点都可以得到一棵大小为 \(n-1\) 的二叉树,考虑每个大小为 \(n-1\) 的二叉树,共有 \(n\) 个叶子节点

[TJOI2015]概率论

[Luogu3978] 看这里 令\(f_n\)表示 \(n\) 个点的二叉树个数 , \(g_n\)表示 \(n\) 个点的所有 \(f_n\)棵二叉树的叶节点总数 \(g_n=nf_{n-1}\) 证明如下 : 对于每棵 \(n\) 个点的二叉树 , 如果里面有 \(k\) 个叶节点 , 那么我们分别把这 \(k\) 个叶子删去会得到 \(k\) 棵 \(n-1\) 个点的二叉树 ; 每棵 \(n-1\)个点的二叉树恰好有 \(n\) 个位置可以悬挂一个新的叶子 , 所以每棵 \(n-1\)

[TJOI2015] 概率论 - Catalan数

一棵随机生成的 \(n\) 个结点的有根二叉树(所有互相不同构的形态等概率出现)的叶子节点数的期望.\(n \leq 10^9\) Solution \(n\) 个点的二叉树个数即 Catalan 数 \(f(n)=\frac{C_{2n}^n}{n+1}\) 设 \(g(n)\) 为 \(n\) 个点的所有二叉树的叶子个数和,找规律得 \(g(n)=nf(n-1)\) Proof. 对于 \(n\) 个点,\(k\) 个叶子的二叉树,删掉任意一个叶子可以得到 \(k\) 个 \(n-1\) 个