题目大意

称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值。

题解

  1. 问题转换,建立模型。

    可以发现,本题就是要求小根完全二叉树的个数。
  2. 树上dp

    定义f[n]为以n为根的完全二叉树个数。

    根据乘法原理,

    f[n] = f[i<<1] * f[i<<1|1] * C(s[i]-1, i << 1)

    可以知道,n可以从后向前递推。

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 5e6+5;
  4. #define ll long long
  5. int n, p;
  6. int f[maxn], s[maxn];
  7. int fact[maxn], ifact[maxn];
  8. int pow(int a, int b, int p) {
  9. int ans = 1;
  10. while(b) {
  11. if(b & 1) ans = (ll) ans * a % p;
  12. b >>= 1;
  13. a = (ll)a * a %p;
  14. }
  15. return ans;
  16. }
  17. int inv(int n, int p) {
  18. return pow(n, p-2, p);
  19. }
  20. void init() {
  21. fact[1] = 1;
  22. ifact[1] = 1;
  23. for(int i = 2; i <= n; i++) {
  24. fact[i] = (ll)i * fact[i-1] % p;
  25. ifact[i] = inv(fact[i], p);
  26. }
  27. }
  28. int C(int n, int m, int p) {
  29. if(n < m) return 0;
  30. return (ll)fact[n] * ifact[m] % p * ifact[n-m] % p;
  31. }
  32. int lucas(int n, int m, int p) {
  33. if(!n && !m) return 1;
  34. return (ll)C(n%p, m%p, p) * lucas(n/p, m/p, p) % p;
  35. }
  36. int main() {
  37. ifact[0] = 1;
  38. scanf("%d %d", &n, &p);
  39. init();
  40. for(int i = n; i; i--) {
  41. s[i] = s[i<<1] + s[i << 1|1] + 1;
  42. f[i] = lucas(s[i]-1, s[i<<1], p);
  43. if(i << 1 <= n) f[i] = (ll)f[i] * f[i<<1] % p;
  44. if((i << 1 | 1) <= n) f[i] = (ll)f[i] * f[i<<1|1] % p;
  45. }
  46. printf("%d", f[1]);
  47. }

[bzoj2111][ZJOI2010]Perm 排列计数 ——问题转换,建立数学模型的更多相关文章

  1. BZOJ2111: [ZJOI2010]Perm 排列计数

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意:一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2< ...

  2. [BZOJ2111][ZJOI2010]Perm排列计数(组合数学)

    题意就是求一个n个点的堆的合法形态数. 显然,给定堆中所有数的集合,则这个堆的根是确定的,而由于堆是完全二叉树,所以每个点左右子树的大小也是确定的. 设以i为根的堆的形态数为F(i),所以F(i)+= ...

  3. [BZOJ2111]:[ZJOI2010]Perm 排列计数(组合数学)

    题目传送门 题目描述 称一个1,2,...,N的排列${P}_{1}$,${P}_{2}$,...,${P}_{N}$是Magic的,当且仅当2≤i≤N时,${P}_{i}$>${P}_{\fr ...

  4. 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数

    [BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...

  5. BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]

    2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1936  Solved: 477[Submit][ ...

  6. 2111: [ZJOI2010]Perm 排列计数

    2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...

  7. bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)

    bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...

  8. 【bzoj2111】[ZJOI2010]Perm 排列计数 dp+Lucas定理

    题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Mogic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Mogic的,答案可能很 ...

  9. 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas

    [题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...

随机推荐

  1. MyFirstDay_答案_1.**猫(自己整理)

    1>***猫: python基础类: 字符串反转的常用处理方式: # 方法一:使用字符串切片 s = "hello python" result = s[::-1] prin ...

  2. POJ 2676 数独(DFS)

    Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21612   Accepted: 10274   Specia ...

  3. AD高级规则设置

    inpolygon 是所有的覆铜 ispad 是焊盘到焊盘的间距 IsVia 过孔间距 ispad and InComponent('S1')    设置某个器件的焊盘间距规则 ispad and H ...

  4. 1196/P2323: [HNOI2006]公路修建问题

    1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2191  Solved: 1258 Descriptio ...

  5. getElementByName????????,????????,

    getElementByName可以获取多个元素,获得的是一个数组, getElementById只能获取一个,是dom从上往下的第一个元素.

  6. IOS多网卡抓包

    linux下libpcap支持从多网卡抓包,设置为any即可 在IOS或者mac上就无法通过次方法抓取所有网卡报文 1.通过设置libevent事件回调,每个网卡注册读事件, fd通过 pd = pc ...

  7. 《Cracking the Coding Interview》——第12章:测试——题目5·

    2014-04-25 00:41 题目:怎么测试一支笔?(Pen?您老说的是钢笔?) 解法:这种简约而不简单的题目,实在是面试官最喜欢,面试者最头疼的类型了.面试官可以只花三秒,以一种灰常高贵冷艳的语 ...

  8. nginx清除反向代理缓存

    nginx重启无法清除反向代理的缓存,可以清空安装目录下的proxy_cache文件夹里的内容来清除.

  9. Python 快速部署安装所需模块

    需求 我们需要在拷给别人或者提交至服务器也用同样的模块,好保持和开发的一样,所以我们需要自己手动写配置模块信息. 方法 在根目录下创建一个 requirements.txt  文件 里面写 模块名== ...

  10. [译]15-spring 自动装配

    前面的章节我们已经学习了如何使用bean元素在xml配置文件中声明一个bean.也学习了如何使用bean的子元素contructor-arg 和property进行bean的依赖项的注入. 之前bea ...