题解

这计数题多水啊我怎么调了那么久啊

我不想老年化啊QAQ

(注意这里的二叉树带标号)

考虑\(g[i]\)表示\(i\)个点二叉树所有节点的深度和,\(f[i]\)表示\(i\)个点的二叉树两两节点之间的路径和

\(h[i]\)表示\(i\)个点的二叉树的方案数(实际上就是\(i!\)= =)

对于一个\(f[i]\)枚举左儿子大小\(j\),右儿子大小是\(i - j - 1\)

计算的时候就是

\(g[i] = \binom{i - 1}{j}(g[j] * h[i - j - 1] + g[i - j - 1] * h[j])\)

\(f[i] = \binom{i - 1}{j}(f[j] * h[i - j - 1] +f[i - j - 1] * h[j])\)

\(f[i] += \binom{i - 1}{j} (h[i - j - 1](g[j] + h[j] * j) + h[j](g[i - j - 1] + h[i - j - 1] * (i - j - 1)))\)

前面的组合数表示给左右儿子新分配的标号

左儿子大小为\(j\)时右儿子有\(h[i - j - 1]\)中形态或标号不同的树和它搭配

最后\(g[i] += h[i] * (i - 1)\)

然后\(f[i] += g[i]\)

表示新加入的根节点所产生新的路径

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define MAXN 400005
#define mo 974711
//#define ivorysi
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 + c - '0';
c = getchar();
}
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);
}
int N,P;
int f[2005],g[2005],h[2005],C[2005][2005];
int inc(int a,int b) {
return a + b >= P ? a + b - P : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % P;
}
void update(int &x,int y) {
x = inc(x,y);
}
void Solve() {
read(N);read(P);
C[0][0] = 1;
for(int i = 1 ; i <= N ; ++i) {
C[i][0] = 1;
for(int j = 1 ; j <= i ; ++j) {
C[i][j] = inc(C[i - 1][j - 1],C[i - 1][j]);
}
}
h[0] = 1;h[1] = 1;
for(int i = 2 ; i <= N ; ++i) {
for(int j = 0 ; j < i ; ++j) {
int t = mul(mul(h[j] , h[i - j - 1]) , C[i - 1][j]);
update(h[i],t);
update(g[i],mul(inc(mul(g[j],h[i - j - 1]) , mul(g[i - j - 1],h[j])) , C[i - 1][j]));
update(g[i],mul(t,i - 1));
update(f[i],mul(inc(mul(f[j] , h[i - j - 1]), mul(f[i - j - 1] , h[j])) , C[i - 1][j]));
int ta = mul(i - j - 1 , inc(g[j] , mul(h[j],j)));
int tb = mul(j , inc(g[i - j - 1] , mul(h[i - j - 1] , i - j - 1)));
update(f[i],mul(inc(mul(ta,h[i - j - 1]) , mul(tb,h[j])) , C[i - 1][j]));
}
update(f[i],g[i]);
}
out(f[N]);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

【LOJ】#2526. 「HAOI2018」苹果树的更多相关文章

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

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

  2. Loj #3096. 「SNOI2019」数论

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

  3. Loj #3093. 「BJOI2019」光线

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

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

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

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

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

  6. Loj #3059. 「HNOI2019」序列

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

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

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

  8. Loj #3055. 「HNOI2019」JOJO

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

  9. Loj 3058. 「HNOI2019」白兔之舞

    Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...

随机推荐

  1. MT【201】折线计数

    甲乙两人参加竞选,结果甲得n票,乙得m票(n > m) . 则在唱票过程中,甲的累计票数始终超过乙的累计票数的概率是_____________. 答案:$\dfrac{n-m}{n+m}$

  2. 【转】MPU6050的数据获取、分析与处理

    摘要 MPU6050是一种非常流行的空间运动传感器芯片,可以获取器件当前的三个加速度分量和三个旋转角速度.由于其体积小巧,功能强大,精度较高,不仅被广泛应用于工业,同时也是航模爱好者的神器,被安装在各 ...

  3. UDP ------ UDP打洞

    为什么需要UDP打洞 处于两个不同局域网的主机不能直接进行UDP通信 UDP"打洞"原理 1.       NAT分类 根据Stun协议(RFC3489),NAT大致分为下面四类 ...

  4. linux ------ 硬连接和软连接(软连接也叫符号连接)

    在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号 (Inode Index).在Linux中,多个文件名指向同一索引节点是存在的.一般这种连接就是硬连接 ...

  5. Java基础-hashMap原理剖析

    Java基础-hashMap原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.什么是哈希(Hash) 答:Hash就是散列,即把对象打散.举个例子,有100000条数 ...

  6. node.js+express,实现RESTful API

    node代码如下(exptest.js): var express = require('express'); var bodyParser = require('body-parser'); var ...

  7. Lua程序设计(三)面向对象实现一个简单的类

    1.Lua面向对象实现步骤 ①创建一个全局表(称之为元表) ②设置这个元表的__index值(值通常为元表自己,这样就能通过__index查找到对应的属性和方法)__index 赋值其实是一个func ...

  8. JMS学习(二)之ActiveMQ

    1,ActiveMQ是Apache实现的基于JMS的一个消息服务器.下面记录ActiveMQ的一些基本知识. 2,ActiveMQ connectors:ActiveMQ providesconnec ...

  9. Linux - Port 端口检测方式

    ss 和 netstat 区别 netstat是遍历/proc下面每个PID目录: ss直接读/proc/net下面的统计信息. 所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多 ne ...

  10. 第12月第2天 uiscrollview _adjustContentOffsetIfNecessary 圆角

    1. uiscrollview在调用setFrame,setBounds等方法的时候会默认调用稀有api: _adjustContentOffsetIfNecessary 这个方法会改变当前的cont ...