BZOJ5305 [Haoi2018]苹果树

BZOJ5305 [Haoi2018]苹果树

大家好,又见面了,我是你们的朋友全栈君。

可以发现一个\(n\)节点的树的方案数是\(n!\)

因为对于第\(i\)个点有\(i\)种选择方式 可以归纳证明 第\(i\)个点选择一个位置之后又新加入了他的左右子树 即可选择位置变为\(i+1\)

那么我们对于一个点\(i\)枚举它的子树大小\(j\) 统计要经过他和父亲的连边的点对数

它的子树的方案数即为\(j!*C_{n-i}^{j-1}\)

子树外首先要先构造出大小为\(i\)的子树 方案数\(i!\)

之后我们再在外面这棵树上添加新节点 容易发现点\(i\)的子树不能再填充 相当于少了\(2\)个填充位置 于是对于剩下的\(n-i-j+1\)个点的方案数即为\(\sum_{k=1}^{n-i-j+1}(k+i-2)\)

当然对于每一种方案它的点对数都是\(j*(n-j)\)

将以上各式相乘并化简即得\(ans=\sum_{i=1}^{n}\sum_{j=1}^{n-i+1}(j! * (n-j)! * \binom{n-i}{j-1} * i * (i-1) * j)\)

#include<bits/stdc++.h>
using namespace std;
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define pa pair<int,int>
#define ll long long
#define mk make_pair
#define pb push_back
#define fi first
#define se second
#define cl(x) memset(x,0,sizeof x)
#ifdef Devil_Gary
#define bug(x) cout<<(#x)<<" "<<(x)<<endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define bug(x)
#define debug(...)
#endif
const int INF = 0x7fffffff;
const int N=2e3+5;
/*
char *TT,*mo,but[(1<<15)+2];
#define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/
inline int read(){
    int x=0,rev=0,ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return rev?-x:x;
}
int n,mod,ans,fac[N],C[N][N];
void init(){
    fac[0]=fac[1]=1;
    for(int i=2;i<=n;i++) fac[i]=(ll)fac[i-1]*i%mod;
    for(int i=0;i<=n;i++){
        C[i][0]=1;
        for(int j=1;j<=i;j++)
        C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
    }
}
int calc(int a,int b){
    return (ll)a*(a-1)*b%mod;
}
int main(){
#ifdef Devil_Gary
    freopen("in.txt","r",stdin);
#endif
    n=read(),mod=read(),init();
    for(int i=2;i<=n;i++) for(int j=n-i+1;j;--j) (ans+=(ll)fac[j]*fac[n-j]%mod*C[n-i][j-1]%mod*calc(i,j)%mod)%=mod;//,bug(ans); 
    printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/devil-gary/p/9067329.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107501.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • GridView导出Excel的超好样例「建议收藏」

    GridView导出Excel的超好样例「建议收藏」事实上网上有非常多关于Excel的样例,可是不是非常好,他们的代码没有非常全,读的起来还非常晦涩。经过这几天的摸索,最终能够完毕我想要导出报表Excel的效果了。以下是我的效果图。一.前台的页面图Gr

    2022年7月4日
    21
  • matlab分段函数怎么画图_关于MATLAB中分段函数的画法[通俗易懂]

    matlab分段函数怎么画图_关于MATLAB中分段函数的画法[通俗易懂]关于MATLAB中分段函数的画法最近拿到一题关于MATLAB的分段函数画法的题目,我在网上找了挺久,但没发现很多有用的资料.所以感觉很棘手.但是问题还是要解决,所以我就自己整理了些东西,不怕大家见笑.我把这些分段函数分为两类:一.对于y=f(x)这个模型来讲,一类是关于其中一个段是y为常量的一个模型,举例说明.例1.y={0,(x<0);1,(x>=0)};在x>-10&…

    2022年5月31日
    129
  • 启动了韩剧_startactivity

    启动了韩剧_startactivity一般来说当我们从launcher中启动一个应用进入到ActivityA中,系统会为这个应用生成一个新任务堆栈并置于前台,ActivityA被放入栈底,之后从ActivityA启动另一个ActivityB,如果不设置什么附加属性,ActivityB默认也放到和ActivityA这个堆栈中,这样当你按返回时,B出栈,A呈现出来了,这个应该很好理解。那现在假如ActivityA启动一个Service…

    2022年10月5日
    0
  • ROC曲线与AUC

    ROC曲线与AUC对于0,1两类分类问题,一些分类器得到的结果往往不是0,1这样的标签,如神经网络,得到诸如0.5,0,8这样的分类结果.这时,我们人为取一个阈值,比如0.4,那么小于0.4的为0类,大于等于0.4的为1类,可以得到一个分类结果。同样,这个阈值我们可以取0.1,0.2等等。取不同的阈值,得到的最后的分类情况也就不同。阈值不同,可以得到不同的结果,但是由分类器决定的统计图始终是不变的。这时候就需要一个独立与阈值,只与分类器有关的评价指标,来衡量特定分类器的好坏。还有在类不平衡的情况下,如正样本90个,负样本

    2022年5月13日
    42
  • jdbc是数据库连接池么_零之轨迹超详细攻略

    jdbc是数据库连接池么_零之轨迹超详细攻略JDBC数据库连接池一、JDBC数据库连接池的必要性二、数据库连接池技术三、多种开源的数据库连接池3.1C3P0数据库连接池3.2DBCP数据库连接池3.3Druid(德鲁伊)数据库连接池一、JDBC数据库连接池的必要性1、在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:(1)在主程序(如servlet、beans)中建立数据库连接(2)进行sql操作(3)断开数据库连接2、这种模式开发,存在的问题:(1)普通的JDBC数据库连接使用DriverManager来

    2022年9月17日
    0
  • url加时间戳避免再次请求当前路径出现的缓存问题[通俗易懂]

    url加时间戳避免再次请求当前路径出现的缓存问题[通俗易懂]1.先解释一下,为什么要加时间戳: URL后面添加随机数通常用于防止客户端(浏览器)缓存页面。浏览器缓存是基于url进行缓存的,如果页面允许缓存,则在一定时间内(缓存时效时间前)再次访问相同的URL,浏览器就不会再次发送请求到服务器端,而是直接从缓存中获取指定资源。2.加时间戳的方法:[javascript] viewplain copy

    2022年5月1日
    216

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号