[luoguP2606] [ZJOI2010]排列计数(DP)


传送门

如果能够根据题意看出这是一个堆的话,那么就有些思路了。。

首先堆顶必须是最小元素,然后左右儿子可以预处理出来都有多少个数,

把剩余的数任意分配给两个儿子,用排列组合即可

dp(now) = dp(now << 1) * dp(now << 1 | 1) * C(sum[now] 1, sum[now << 1])

#include <cstdio>#define N 5000001#define LL long longint n;LL p, inv[N], A[N], B[N], s[N];inline LL C(int x, int y)inline LL dp(int now)int main()for(i = 1; i <= n; i++)for(j = i; j; j >>= 1) s[j]++;printf("%lld\n", (dp(1) + p) % p);return 0;}

  



上一篇:[luoguP2053] [SCOI2007]修车(最小费用最大流)

下一篇:[BZOJ2118] 墨墨的等式(最短路)


DP
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图