Codeforces 914H Ember and Storm’s Tree Game


题目链接


ORZ

果然出了一套自闭题

这题让你算出第一个人有必胜策略的方案数

然后我们就发现必胜的条件就是树上的每条路径都是单调或者单峰的

所以我们考虑DP一个每条路径都是单调或单峰的树出来

所以考虑DPf[i][j]" role="presentation" style="position: relative;">f[i][j]f[i][j]表示大小是i的子树根节点的度数是j,并且满足任何一个点都比他的父亲大

那么我们发现这样的情况并不全,但是又可以发现满足任何一个点比他的父亲小和大是等价的

所以我们可以开开心心地开始DP

但是问题又来了

我们在统计一个子树的贡献的时候常常会把编号算重,所以我们可以每次DP累加贡献的时候只考虑编号次小的那个点所在的子树

然后我们可以很方便地累加贡献了,还需要加上组合数,又因为我们发现当前累加的子树根节点的度数大小无关紧要,所以我们直接累加前缀和,用s表示

f(i,k+1)=∑f(i−j,k)×(∑l=1d−1f(j,l))×(i−2j−1)" role="presentation" style="position: relative;">f(i,k+1)=∑f(i−j,k)×(∑d−1l=1f(j,l))×(i−2j−1)f(i,k+1)=∑f(i−j,k)×(∑l=1d−1f(j,l))×(i−2j−1)

但是我们又发现,一棵合法的树有可能有多个合法的根被我们统计,但是我们可以发现所有合法的根一定是一条链,然后我们考虑只在链的一端统计答案就可以了


#include<bits/stdc++.h>
using namespace std;
#define fu(a,b,c) for(int a=b;a<=c;a++)
#define fd(a,b,c) for(int a=b;a>=c;a--)
int read(){
int ans=0,w=1;char c=getchar();
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')w=-1,c=getchar();
while(isdigit(c))ans=(ans<<1)+(ans<<3)+c-'0',c=getchar();
return ans*w;
}
#define N 210
#define LL long long
int n,d;
LL ans=0,Mod;
LL c[N][N],f[N][N],s[N][N];
void init(){
fu(i,0,n){
c[i][0]=1;
fu(j,1,i)c[i][j]=(c[i-1][j]+c[i-1][j-1])%Mod;
}
fu(i,0,d)s[1][i]=1;
f[1][0]=1;
}
int main(){
n=read();d=read();Mod=read();
init();
fu(i,2,n){
fu(j,1,i-1)
fu(k,0,d-1)
f[i][k+1]=(s[j][d-1]*c[i-2][j-1]%Mod*f[i-j][k]%Mod+f[i][k+1])%Mod;
fu(j,1,d)s[i][j]=(s[i][j-1]+f[i][j])%Mod;
}
fu(i,0,n-1)
fu(j,0,d)
fu(k,0,d-j)if(k!=1)
ans=(ans+f[i+1][j]*f[n-i][k]%Mod)%Mod;
ans=2ll*n*(n-1)*ans%Mod;
printf("%lld",ans);
return 0;
}

Codeforces 914H Ember and Storm's Tree Game 【DP】*的更多相关文章

  1. Codeforces gym 101291 M (最长交替子序列)【DP】

    <题目链接> 题目大意:给你一段序列,要求你求出该序列的最长交替子序列,所谓最长交替子序列就是,这段序列的相邻三项必须是先递增再递减或者先递减再递增这样交替下去. 解题分析: 这与一道dp ...

  2. 【CodeForces】914 H. Ember and Storm's Tree Game 动态规划+排列组合

    [题目]H. Ember and Storm's Tree Game [题意]Zsnuoの博客 [算法]动态规划+排列组合 [题解]题目本身其实并不难,但是大量干扰因素让题目显得很神秘. 参考:Zsn ...

  3. [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】

    [CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...

  4. 【codeforces 914H】Ember and Storm's Tree Game

    原题链接 Description Ember和Storm正在玩游戏.首先,Ember构造一棵n个节点且每个节点度数不超过d的带节点编号的树T.然后,Storm选择两个不同的节点u和v,并写下从u到v路 ...

  5. Codeforces 804D Expected diameter of a tree(树形DP+期望)

    [题目链接] http://codeforces.com/contest/804/problem/D [题目大意] 给你一个森林,每次询问给出u,v, 从u所在连通块中随机选出一个点与v所在连通块中随 ...

  6. 【dp】codeforces C. Vladik and Memorable Trip

    http://codeforces.com/contest/811/problem/C [题意] 给定一个自然数序列,在这个序列中找出几个不相交段,使得每个段的异或值之和相加最大. 段的异或值这样定义 ...

  7. Codeforces 658C Bear and Forgotten Tree 3【构造】

    题目链接: http://codeforces.com/contest/658/problem/C 题意: 给定结点数,树的直径(两点的最长距离),树的高度(1号结点距离其他结点的最长距离),写出树边 ...

  8. Storm配置项详解【转】

    Storm配置项详解 ——阿里数据平台技术博客:storm配置项详解 什么是Storm? Storm是twitter开源的一套实时数据处理框架,基于该框架你可以通过简单的编程来实现对数据流的实时处理变 ...

  9. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

随机推荐

  1. python print和strip

    在使用这两个模块时犯过错误,总结如下: 1.print print在打印时会自动加上换行,例如: >>> for i in xrange(1,5): ... print i ... ...

  2. windows组策略屏蔽

    点“IP安全策略,在本地机器”——>创建IP安全策略---->下一步---->名称随便写,如输入阻止,然后一直点下一步,出现提示点是,一直到完成,这个时候就创建了一个名为“阻止”的策 ...

  3. 简单的使用hibernate插入数据的例子

    数据库创建脚本: drop table person create table person( id          varchar(32)         not null primary key ...

  4. Hibernate与 MyBatis的比较(转,留作以后细细钻研)

    最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处. 第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出 ...

  5. 使用MessageFormat替换字符中的占位符

    使用String.format可以实现字符串的格式化功能,即将后面参数中的值替换掉format中的%s,%d这些值.但MessageFormat更为强大,不用管传入值是字符串还是数字,使用占位符即可. ...

  6. ctci1.4

    ;     ;     ; i < len ; i++)         ;      +];     ; i < len; i++){         ';         }      ...

  7. model 数据注解

    https://www.cnblogs.com/leoxuan/articles/6555396.html ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Mode ...

  8. MongoDB基于GridFS管理文件

    前言 GridFS是一种将大型文件存储在MongoDB的文件规范: 数据库支持以BSON格式保存二进制对象. 但是MongoDB中BSON对象最大不能超过4MB. GridFS 规范提供了一种透明的机 ...

  9. hdu1520树形dp第一题

    判断最大的欢喜值,如果上司来了,直系下属就不来 如果子节点j不来那么dp[i][1]+=dp[j][0];如果子节点j来那么dp[i][0]+=max(dp[j][0],dp[j][1]);//因为j ...

  10. Java多态性的理解2

    多态的基础理解请参考:http://www.cnblogs.com/liujinhong/p/6003144.html Java的多态一直是我们理解的一个难点.在读过<深入理解Java虚拟机&g ...