【题目】H. Ember and Storm's Tree Game

【题意】Zsnuoの博客

【算法】动态规划+排列组合

【题解】题目本身其实并不难,但是大量干扰因素让题目显得很神秘。

参考:Zsnuoの博客

一、首先Ember必胜(考虑n个点连成一条链),故合法的树一定满足先手必胜。当Storm选择的链满足单调或单峰时,每一条链对答案贡献两对(i,op)

解释:单调时,考虑翻转最后一个数和从第二个数开始取负两种操作。单峰时,上凸考虑翻转顶峰和顶峰右侧的数,下凸考虑取负顶峰和顶峰右侧的数。

这样之后,我们就完全排除了博弈的因素(胜负和操作选择)。

二、问题转化为:令S表示满足 [ 包含n个点 ] 且 [ 每个点出度<=d ] 且 [ 所有树链编号单调或单峰 ] 的树,由(一)得最终答案ANS=2*n*(n-1)*|S|,即求|S|

其中单峰的路径比较容易考虑,S一定存在一个形态,满足所有单峰路径(u,v)的峰都是lca(u,v)。

证明:如果有一条路径峰不在LCA,那么lca(u,v)向上延伸一定是单调的,那选该峰作为根即可。

接下来考虑单调的路径(u,v)(u,v互不为祖先),易得如果lca(u,v)≠root就无法满足条件,所以不同单调性的指向根的链只能在根相遇。

也就是,每棵树都存在至少一个根root,满足所有以root为端点的路径都是单调的。接下来我们只须统计同一单调性的树的个数,在根处拼起来即可。

三、设f[i][j]表示包含i个点,根节点出度为j且满足 [ 所有节点编号均大于其父亲节点编号 ] 的树的个数。

同排列DP一样,我们关心的只有子树节点编号的大小关系,和具体是什么无关。所以我们每次都视为编号为1~i的节点来统计即可。

规定父亲节点编号为1,为了不重复统计,每次枚举根节点编号为2的子树大小k来转移,即:

$$f(i,j)=\sum _{k=1}^{i-1}f(i-k,j-1)*\binom{i-2}{k-1}*\sum _{l=0}^{d-1}f(k,l)$$

从未确定的i-2个点中选择一些来构成子树中的k-1个点,即C(i-2,k-1),然后再按大小关系当成2~k排列。

令$sum(i)=\sum _{j=0}^{d-1}f(i,j)$,就可以前缀和优化:

$$f(i,j)=\sum _{k=1}^{i-1}f(i-k,j-1)*\binom{i-2}{k-1}*sum(k)$$

预处理组合数,初始化f(1,0)=1。(这样就不用理会非素数模数了,不然又得搞CRT那套,太麻烦了……)

四、在根节点处拼接。

假设两个根节点都为root的不同单调性的树拼接(根节点重合),枚举第一单调性的点数i,第一单调性所占度数j,第二单调性所占度数k,即:

$$|S|=\sum _{i=1}^{n}\sum _{j+k\leq d}f(i,j)*f(n-i+1,k)$$

最后一个问题,如果一棵树S存在多个root(例如n=2),那么这多个root一定构成一条单调链,其中一端是j=1且k≠1,另一端是j≠1且k=1,中间是j=1且k=1,我们只在第一种情况统计这棵树。

那么,最终:

$$|S|=\sum _{i=1}^{n}\sum _{j+k\leq d,k\neq 1}f(i,j)*f(n-i+1,k)$$

复杂度O(n^3)。

#include<cstdio>
const int maxn=; long long n,d,MOD,c[maxn][maxn],sum[maxn],ans,f[maxn][maxn];
int main(){
scanf("%lld%lld%lld",&n,&d,&MOD);
for(int i=;i<=n;i++){
c[i][]=;
for(int j=;j<=i;j++)c[i][j]=(c[i-][j-]+c[i-][j])%MOD;
}
f[][]=sum[]=;
for(int i=;i<=n;i++){
for(int j=;j<=d;j++){
for(int k=;k<i;k++){
f[i][j]=(f[i][j]+f[i-k][j-]*c[i-][k-]%MOD*sum[k])%MOD;
}
if(j!=d)sum[i]=(sum[i]+f[i][j])%MOD;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=d;j++)
for(int k=;j+k<=d;k++)if(k!=)
ans=(ans+f[i][j]*f[n-i+][k])%MOD;
printf("%lld",*n*(n-)*ans%MOD);
return ;
}

【CodeForces】914 H. Ember and Storm's Tree Game 动态规划+排列组合的更多相关文章

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

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

  2. Codeforces 914H Ember and Storm's Tree Game 【DP】*

    Codeforces 914H Ember and Storm's Tree Game 题目链接 ORZ佬 果然出了一套自闭题 这题让你算出第一个人有必胜策略的方案数 然后我们就发现必胜的条件就是树上 ...

  3. Codeforces Round #309 (Div. 2) C. Kyoya and Colored Balls 排列组合

    C. Kyoya and Colored Balls Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...

  4. Codeforces Round #167 (Div. 2) D. Dima and Two Sequences 排列组合

    题目链接: http://codeforces.com/problemset/problem/272/D D. Dima and Two Sequences time limit per test2 ...

  5. Codeforces 840C. On the Bench 动态规划 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF840C.html 题解 首先,我们可以发现,如果把每一个数的平方因子都除掉,那么剩下的数,不相等的数都可以相 ...

  6. Codeforces Gym 100187D D. Holidays 排列组合

    D. Holidays Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/D ...

  7. 【CodeForces】889 C. Maximum Element 排列组合+动态规划

    [题目]C. Maximum Element [题意]给定n和k,定义一个排列是好的当且仅当存在一个位置i,满足对于所有的j=[1,i-1]&&[i+1,i+k]有a[i]>a[ ...

  8. Codeforces 991E. Bus Number (DFS+排列组合)

    解题思路 将每个数字出现的次数存在一个数组num[]中(与顺序无关). 将出现过的数字i从1到num[i]遍历.(i from 0 to 9) 得到要使用的数字次数数组a[]. 对于每一种a使用排列组 ...

  9. [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

    [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...

随机推荐

  1. nginx 二进制安装

    Nginx的安装方法 1:yum安装 默认是1.6版本,且在epel源中   2:源码包编译安装 源码下载:http://nginx.org/en/download.html,下载1.8稳定版本   ...

  2. HDFS shell命令行常见操作

    hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...

  3. adb命令模拟按键事件KeyCode

    例子: //这条命令相当于按了设备的Backkey键 adb shell input keyevent 4 //可以解锁屏幕 adb shell input keyevent  82 //在屏幕上做划 ...

  4. 第79天:jQuery事件总结(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 一.合成事件 jQuery有两个合成事件——hove ...

  5. 网页移动到一个高度后加载网页元素【getBoundingClientRect好用】

    $(window).scroll(function () { var windowH = $(window).height();//取可视窗口的高度 ).getBoundingClientRect() ...

  6. BZOJ 2299 向量(裴蜀定理)

    题意:给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x ...

  7. 转---秒杀多线程第十二篇 多线程同步内功心法——PV操作上 (续)

    PV操作的核心就是 PV操作可以同时起到同步与互斥的作用. 1.同步就是通过P操作获取信号量,V操作释放信号量来进行. 2.互斥其实就是,同时操作P操作,结束后进行V操作即可做到. Java上实现PV ...

  8. 洛谷 P1231 教辅的组成(网络最大流+拆点加源加汇)

    题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书 ...

  9. 【刷题】BZOJ 4025 二分图

    Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input ...

  10. [洛谷P4626]一道水题 II

    题目大意:求$lcm(1,2,3,\cdots,n)\pmod{100000007}$,$n\leqslant10^8$ 题解:先线性筛出质数,然后求每个质数最多出现的次数,可以用$\log_in$来 ...