题目链接

大意:不解释

思路:

首先方案数共有n!种,第1个点只有1种选择,第2个点2种选择,生成2个选择的同时消耗一个,第3个点则有3种选择,依次类推共有n!种方案,由于最后答案*n!,故输出的实际上是每种方案的总和。

由于枚举方案是不可行的,考虑枚举边,计算每一个点连向父亲的边的贡献,容易知道贡献为siz*(n-siz),siz为子树大小。所以枚举点与siz即可。再考虑组成子树的形态,与子树外的形态。设当前枚举到i号点,子树大小为siz,则子树内不考虑编号有siz!种形态,考虑编号则有C(n-i,siz-1)种编号组合,则子树内共有siz!*C(n-i,siz-1)种方案;考虑子树外:由于已有i个点,这i个点可以有i!种方案,从第i+siz-1点开始由于以i为根的子树siz已确定,故这个点不能插入到以i为根的子树内,所以只有i-1种选择,这一部分贡献为(i-1)*(i)*(i+1)*……*(n-siz-1),与前面的总和化简得i*(i-1)*(n-siz-1)!。则当前枚举的点i与siz对答案的贡献为siz*(n-siz)*i*(i-1)*(n-siz-1)!*C(n-i,siz-1)*siz!。预处理出组合和阶乘枚举点i和siz统计即可。时间复杂度O(n^2);

 #include <iostream>
#include <cstdio>
#include <memory.h>
#define r(x) x=read()
#define MAXX 2005
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
using namespace std;
typedef long long ll;
ll read()
{
char ch=;ll w=,ff=;
while(ch<''||ch>''){if(ch=='-')ff=-;ch=getchar();}
while(ch>=''&&ch<=''){w=w*+ch-'';ch=getchar();}
return ff*w;
}
ll P,n,fac[MAXX][MAXX],jie[MAXX],ans;
int main()
{
jie[]=1ll;
r(n),r(P);
for(int i=;i<=n;++i)
for(int j=;j<=i;++j)
fac[i][j]=(j==?:(fac[i-][j-]+fac[i-][j])%P);
for(int i=;i<=;++i) jie[i]=jie[i-]*i*1ll%P;
for(int i=;i<=n;++i)
for(int sz=;sz<=n-i+;++sz)
ans=(ans+(sz*1ll*(n-sz)*1ll%P*jie[sz]%P*jie[n-sz-]%P*i*(i-)%P*fac[n-i][sz-])%P)%P;
printf("%lld",ans%P);
return ;
}

[HAOI2018]苹果树题解的更多相关文章

  1. 【BZOJ5305】[HAOI2018]苹果树(组合计数)

    [BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...

  2. [洛谷P4492] [HAOI2018]苹果树

    洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C ...

  3. [HAOI2018]苹果树(组合数学,计数)

    [HAOI2018]苹果树 cx巨巨给我的大火题. 感觉这题和上次考试gcz讲的那道有标号树的形态(不记顺序)计数问题很类似. 考虑如果对每个点对它算有贡献的其他点很麻烦,不知怎么下手.这个时候就想到 ...

  4. 题解 洛谷 P4492 【[HAOI2018]苹果树】

    考虑生成一颗二叉树的过程,加入第一个节点方案数为\(1\),加入第二个节点方案数为\(2\),加入第三个节点方案数为\(3\),发现生成一颗\(n\)个节点的二叉树的方案数为\(n!\). 所以题目中 ...

  5. HAOI2018 简要题解

    这套题是 dy, wearry 出的.学长好强啊,可惜都 \(wc\) 退役了.. 话说 wearry 真的是一个计数神仙..就没看到他计不出来的题...每次考他模拟赛总有一两道毒瘤计数TAT 上午的 ...

  6. [BZOJ5305][HAOI2018]苹果树 组合数学

    链接 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, ...

  7. HAOI2018苹果树

    题解 首先所有生成树的情况树是\(n!\)的,因为第一次有1中方法,第二次有两种放法,以此类推... 然后我们发现距离这种东西可以直接枚举每条边算贡献. 于是我们枚举了一个点\(i\),又枚举了这个点 ...

  8. [HAOI2018]苹果树

    嘟嘟嘟 这种计数大题就留给南方的计数神仙们做吧-- 刚开始我一直想枚举点,考虑新加一个点在根节点的左右子树,以及左右子树大小怎么分配,但是这样太难计算新的点带来的贡献了. 后来lba又提示我枚举边,考 ...

  9. BZOJ5305 [Haoi2018]苹果树 【组合数学】

    题目链接 BZOJ5305 题解 妙啊 要求的是所有可能的树形的所有点对距离和 直接考虑点的贡献肯定想不出,这样的所有点对距离问题通常转化为边的贡献 考虑一条边会产生多少贡献 我们枚举\(i\)节点的 ...

随机推荐

  1. Python 创建数据库表

    创建数据库表 如果数据库连接存在我们可以使用execute()方法来为数据库创建表,如下所示创建表EMPLOYEE: #!/usr/bin/python # -*- coding: UTF-8 -*- ...

  2. sh_12_字典的遍历

    sh_12_字典的遍历 xiaoming_dict = {"name": "小明", ", "} # 迭代遍历字典 # 变量k是每一次循环中 ...

  3. H5 video全屏与取消全屏兼容

    H5 video全屏与取消全屏各浏览器兼容,  requestFullscreen()全屏方法,exitFullscreen()退出全屏方法.兼容各个浏览器与css3兼容一样加个前缀即可. // 全屏 ...

  4. Apicloud_(模板)登陆注册功能模板

    项目已托管到Github上 传送门 不需要使用任何图片资源,需要用到SHA1.js库文件, Apicloud_(接口验证)用户注册头部信息X-APICloud-AppKey生成 传送门 项目全代码放到 ...

  5. Unity3D_(API)Quaternion四元数中的Quaternion.LookRotation()

    四元数百度百科: 传送门 四元数官方文档: 传送门 欧拉旋转.四元数.矩阵旋转之间的差异: 传送门 四元数转换为欧拉角eulerAngles 官方文档: 传送门 欧拉角转换为四元数Euler 官方文档 ...

  6. input(移动端iOS)输入内容时调用软件盘后页面底部留白问题

    iOS/input输入框调用软键盘底部留白 只需input输入框失去焦点时,让页面自动下移即可恢复 <input placeholder="请输入用户名" v-model=& ...

  7. 7. 进行图片的数据补全和增强(随机亮度,随机饱和度,随机翻转) Image.open(进行图片的读入) 2.ImageEnhance.Brightness(亮度变化) 3.ImageEnhance.Contrast(饱和度变化) 4.enhance_image.transpose(图片随机翻转) 5.enhance_image.save(进行图片保存)

    1.Image.open(image_path)  进行图片的打开 参数说明:image_path 表示图片的路径 2. ImageEnhance.Brightness(image)  # 进行图片的 ...

  8. QQ聊天监视器(简易版),可以获取当前QQ进程的聊天窗口内容

    原始出处: https://www.cnblogs.com/Charltsing/p/QQChatsMonitor.html 监视QQ聊天信息有很多种方法,最简易的就是直接抓取聊天窗口内容,一个QQ进 ...

  9. docker-compose部署redis-cluster

    node1-node6 1.到http://download.redis.io/redis-stable/redis.conf下载官方redis.conf文件 2.修改对应端口 # bind 127. ...

  10. [mysql]设置创建时间,更新时间未生效

    问题描述: 新增一条case,create_time没有自动生成创建时间,值为空 原因 : create_time字段类型是DateTime(错误)而不是TIMESTAMP(正确)  解决办法: 把c ...