题目描述

称一个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:

20 23 
输出样例#1:

16

说明

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

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

题解:

暴力30...

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,p,ans,a[];
int main(){
scanf("%d%d",&n,&p);
for(int i=;i<=n;i++)a[i]=i;
do{
bool flag=false;
for(register int i=;i<=n;i++){
if(a[i]<a[i/]){
flag=true;break;
}
}
if(!flag)ans=(ans%p+%p)%p;
}while(next_permutation(a+,a+n+));
printf("%d\n",ans);
return ;
}

正解: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了....

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000009
#define LL long long
using namespace std; LL n,p;
LL f[maxn],inv[maxn],s[*maxn],dp[maxn]; LL ksm(LL x,LL y){
LL ret=%y;
while(y){
if(y&)ret=(1LL*ret*x)%p;
x=1LL*x*x%p;
y>>=;
}
return ret;
} void pre(){
f[]=inv[]=;
for(int i=;i<=n;i++)f[i]=(1LL*f[i-]*i)%p;
for(int i=;i<=n;i++)inv[i]=ksm(f[i],p-)%p;
} LL C(LL n,LL m){
return 1LL*f[n]*inv[m]%p*inv[n-m]%p;
} LL Lucas(LL n,LL m){
if(!m)return ;
return C(n%p,m%p)*Lucas(n/p,m/p)%p;
} int main(){
scanf("%lld%lld",&n,&p);
pre();
for(int i=n;i>=;i--){
s[i]=s[i<<]+s[i<<|]+;
dp[i]=Lucas(s[i]-,s[i<<])%p;
if((i<<)<=n)dp[i]=dp[i]*dp[i<<]%p;
if((i<<|)<=n)dp[i]=dp[i]*dp[i<<|]%p;
dp[i]=dp[i]%p;
}
printf("%lld\n",dp[]%p);
return ;
}

洛谷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. HackerRank - fibonacci-modified 【大数】

    思路 用PYTHON 或 JAVA 干掉 AC代码 a, b, n = map(int, input().split()) for i in range (2, n, 1) : temp = b b ...

  2. facebook开源了他们的分布式大数据DB

    https://github.com/facebook/presto facebook 3天前开源了他们的 分布式大数据DB Distributed SQL query engine for big ...

  3. GPU的工作原理

    转:https://blog.csdn.net/p23onzq/article/details/79609629 在GPU出现以前,显卡和CPU的关系有点像“主仆”,简单地说这时的显卡就是画笔,根据各 ...

  4. uboot相关的几篇好文

    http://www.eeworld.com.cn/mcu/2015/0727/article_21246.html http://blog.csdn.net/kernel_yx/article/de ...

  5. cocos2dx打飞机项目笔记四:Enemy类和EnemyLayer类

    Enemy类没什么内容,就create和init方法,根据参数来创建不同的敌机,头文件代码如下: //飞机的类型 enum planeType {smallPlane, midPlane, bigPl ...

  6. VCFtools

    The C++ executable module examples This page provides usage examples for the executable module. Exte ...

  7. java arrays类学习

    java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的. 具有以下功能: (1)给数组赋值:通过fill方法. (2)对数组排序:通过sort方法,按升序. (3)比较数组:通 ...

  8. HBase学习2(HBase shell)

    HBase 常用命令 查看当前用户:whoami 创建表:create '表名', '列族名1','列族名2','列族名N' 查看所有表:list 描述表: describe '表名' 判断表存在: ...

  9. Phoenix性能优化

    目录: 1.建表优化 2.二级索引 3.并行处理 1.建表优化 Salting 翻译成中文是加盐的意思,本质是在hbase的rowkey的byte数组的第一个字节位置设定一个系统生成的byte值, 这 ...

  10. Java中finally关键字的使用(转)

    与其他语言的模型相比,finally 关键字是对 Java 异常处理模型的最佳补充.finally 结构使代码总会执行,而不管有无异常发生.使用 finally 可以维护对象的内部状态,并可以清理非内 ...