题目描述

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

输入输出格式

输入格式:

输入文件的第一行包含两个整数 n和p,含义如上所述。

输出格式:

输出文件中仅包含一个整数,表示计算1,2,⋯, ���的排列中, Magic排列的个数模 p的值。

输入输出样例

输入样例#1:

  1. 20 23
输出样例#1:

  1. 16

说明

100%的数据中,1 ≤N ≤ 10^6, P≤ 10^9,p是一个质数。

题目大意:求1--n能构成小根堆的排列

题解:

暴力30...

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. int n,p,ans,a[];
  6. int main(){
  7. scanf("%d%d",&n,&p);
  8. for(int i=;i<=n;i++)a[i]=i;
  9. do{
  10. bool flag=false;
  11. for(register int i=;i<=n;i++){
  12. if(a[i]<a[i/]){
  13. flag=true;break;
  14. }
  15. }
  16. if(!flag)ans=(ans%p+%p)%p;
  17. }while(next_permutation(a+,a+n+));
  18. printf("%d\n",ans);
  19. return ;
  20. }

正解:Lucas定理+树形dp

没看出来是小根堆...我这个沙茶...

然后根一定是最小的,然后f[i]=c(s[i]-1,s[i<<1])*f[l]*f[r]

f[i]表示以i为根的小根堆的数量....然后左子树的大小就是从s[i]-1(减去根

中选出s[i<<1],用Lucas定理求就行啦...

因为有子问题的....

ps:不知道为什么一直WA,抱着试试看的心态,我多加了一个取模。

你猜怎么着?就A了....

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define maxn 1000009
  5. #define LL long long
  6. using namespace std;
  7.  
  8. LL n,p;
  9. LL f[maxn],inv[maxn],s[*maxn],dp[maxn];
  10.  
  11. LL ksm(LL x,LL y){
  12. LL ret=%y;
  13. while(y){
  14. if(y&)ret=(1LL*ret*x)%p;
  15. x=1LL*x*x%p;
  16. y>>=;
  17. }
  18. return ret;
  19. }
  20.  
  21. void pre(){
  22. f[]=inv[]=;
  23. for(int i=;i<=n;i++)f[i]=(1LL*f[i-]*i)%p;
  24. for(int i=;i<=n;i++)inv[i]=ksm(f[i],p-)%p;
  25. }
  26.  
  27. LL C(LL n,LL m){
  28. return 1LL*f[n]*inv[m]%p*inv[n-m]%p;
  29. }
  30.  
  31. LL Lucas(LL n,LL m){
  32. if(!m)return ;
  33. return C(n%p,m%p)*Lucas(n/p,m/p)%p;
  34. }
  35.  
  36. int main(){
  37. scanf("%lld%lld",&n,&p);
  38. pre();
  39. for(int i=n;i>=;i--){
  40. s[i]=s[i<<]+s[i<<|]+;
  41. dp[i]=Lucas(s[i]-,s[i<<])%p;
  42. if((i<<)<=n)dp[i]=dp[i]*dp[i<<]%p;
  43. if((i<<|)<=n)dp[i]=dp[i]*dp[i<<|]%p;
  44. dp[i]=dp[i]%p;
  45. }
  46. printf("%lld\n",dp[]%p);
  47. return ;
  48. }

洛谷P2606 [ZJOI2010]排列计数的更多相关文章

  1. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  2. ●洛谷P2606 [ZJOI2010]排列计数

    题链: https://www.luogu.org/problemnew/show/P2606题解: 组合数(DP),Lucas定理 首先应该容易看出,这个排列其实是一个小顶堆. 然后我们可以考虑dp ...

  3. 洛谷P2606 [ZJOI2010]排列计数(组合数 dp)

    题意 题目链接 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案 ...

  4. 洛谷P2606 [ZJOI2010]排列计数(数位dp)

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

  5. 洛谷P2606 [ZJOI2010]排列计数 组合数学+DP

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

  6. P2606 [ZJOI2010]排列计数

    P2606 [ZJOI2010]排列计数 因为每个结点至多有一个前驱,所以我们可以发现这是一个二叉树.现在我们要求的就是以1为根的二叉树中,有多少种情况,满足小根堆的性质. 设\(f(i)\)表示以\ ...

  7. BZOJ1833或洛谷2602 [ZJOI2010]数字计数

    BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之 ...

  8. 洛谷 P2602 [ZJOI2010]数字计数

    洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于 ...

  9. 洛谷P4071 [SDOI2016] 排列计数 [组合数学]

    题目传送门 排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m ...

随机推荐

  1. RHEL(或CentOS)中关于逻辑卷( Logical Volume Manager,LVM)的一些概念及使用LVM的例子

    1.逻辑卷(logical volumes,LV) 卷管理在物理存储之上的抽象层,它使你能够创建逻辑存储卷.和直接使用物理存储相比,这从很多方面提供了更大的灵活性.比如,使用逻辑卷,你将不再受物理磁盘 ...

  2. Python编程-数据库

    1.MySQL 程序: socket客户端 根据IP和端口进行连接 发送指令: xxx 接收结果 socket服务端 运行起来 获取指令(recv) xxx 解析命令 文件夹操作: ... 文件操作: ...

  3. libstdc和glibc的一些共享库问题

    1./usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found错误的解决 原因是没有GLIBCXX_3.4.15版本,或是更高的版本输入命令 ...

  4. HAproxy 介绍

    HAproxy 介绍 (1)HAProxy 是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy ...

  5. awk的逻辑运算符

    运算符 描述 赋值运算符 = += -= *= /= %= ^= **= 赋值语句 逻辑运算符 || 逻辑或 && 逻辑与 正则运算符 ~ ~! 匹配正则表达式和不匹配正则表达式 关系 ...

  6. Java远程执行Shell命令

    1. Jar包:ganymed-ssh2-build210.jar 2. 步骤: a) 连接: Connection conn = new Connection(ipAddr); conn.conne ...

  7. freemarker入门实例与源码研究准备工作

    首先去freemarker官网下载源码jar包,本文是基于freemarker-2.3.21.tar.gz进行研究的.解压源码包,找到freemarker的源码部分导入eclipse工程中.需要注意的 ...

  8. 算法总结之 在数组中找到出现次数 > N/K的数

    题目1 给定一个整型数组arr,  打印其中出现次数大于一半的数, 如果没有这样的数,打印提示信息 进阶 给定一个整型数组arr, 再给定一个整数K, 打印所有出现次数大于 N/K的数,如果没有这样的 ...

  9. Spark常用算子-KeyValue数据类型的算子

    package com.test; import java.util.ArrayList; import java.util.List; import java.util.Map; import or ...

  10. 导入Jquery.min.js时 JQuery 上打红X了

    问题解决:右击jquery.min.js——>MyEclipse——>点击Exclude From Validation——>点击Run Validation 即可