P2606 [ZJOI2010]排列计数

因为每个结点至多有一个前驱,所以我们可以发现这是一个二叉树。现在我们要求的就是以1为根的二叉树中,有多少种情况,满足小根堆的性质。

设\(f(i)\)表示以\(i\)为根的子树中满足小根堆性质的情况,那么就有:\(f(i)=f(ls)*f(rs)*C_{sum(i)-1}^{sum(ls)}\)。表示选出\(sum(ls)\)个结点来作为左儿子中的结点,并且左右儿子都满足小根堆的性质。这里左右儿子这两个问题都是独立的,所以可以直接运用乘法原理。

这里求组合数可以直接用Lucas定理来求,Lucas定理为:若p是一个质数,那么\(C_n^m=C_{\frac{n}{p}}^{\frac{m}{p}}*C_{n\mod p}^{m\mod p}\mod p\)。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int N = 2e6 + 5;
ll n, p;
ll inv[N], fac[N], s[N], f[N];
ll C(ll a, ll b) {
if(a < b) return 0;
if(a == b || b == 0) return 1;
if(a < p && b < p) return inv[b] * inv[a - b] % p * fac[a] % p;
return C(a % p, b % p) * C(a / p, b / p) % p;
}
ll qp(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % p;
a = a * a % p;
b >>= 1;
}
return ans ;
}
int main() {
cin >> n >> p;
fac[0] = 1;
for(int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % p;
for(int i = 1; i <= n; i++) inv[i] = qp(fac[i], p - 2) ;
for(int i = 1; i <= n; i++) s[i] = 1;
for(int i = n; i >= 2; i--) s[i >> 1] += s[i] ;
for(int i = n; i >= 1; i--) {
int ls = i << 1, rs = i << 1 | 1;
if(f[ls] && f[rs]) f[i] = f[ls] * f[rs] % p * C(s[i] - 1, s[ls]) % p;
else if(f[ls]) f[i] = f[ls] ;
else f[i] = 1;
}
cout << f[1] ;
return 0;
}

最新文章

  1. PyQt4入门学习笔记(三)
  2. 五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程
  3. 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launcher
  4. 2016年7月2日 星期六 --出埃及记 Exodus 14:29
  5. “Unable to execute dex: Multiple dex files”如何解决?
  6. Groovy获取json和xml数据
  7. 动画(Animation) 之 (闪烁、左右摇摆、上下晃动等效果)
  8. android LinearLayout android:layout_weight 作用,固定比例
  9. 数据分析≠Hadoop+NoSQL
  10. form表单和表格
  11. PL/SQL 编程(三 )程序包和包体,触发器,视图,索引
  12. 201521123032 《Java程序设计》第3周学习总结
  13. Windows下如何更新 CodeBlocks 中的 MinGW 使其支持新版本 C++
  14. 从vue渲染想到的数组方法
  15. linux python 安装到用户目录
  16. C#高级编程----反射的小结
  17. Pycharm出现Segmentation fault...(interrupted by signal 11: SIGSEGV)的解决方法
  18. 【java】匿名对象
  19. 用singleton单例模式实现一个模块
  20. WEB框架Django之中间件/缓存/CBV/信号

热门文章

  1. 头部文件jq嵌入笔记
  2. POJ-图论-并查集模板
  3. ThreadLocal源代码3
  4. PHP防止被重复请求接口的方法(网页端签名验证的方法)
  5. Mysql 查询时间段是否可用,查询时间段是否有交集
  6. 【剑指offer】删除链表中重复的结点
  7. was unable to refresh its cache! status = Cannot execute request on any known server
  8. linux安装Elasticsearch详细步骤
  9. Function Evaluation
  10. FMX 隐藏任务栏 xe10