题干:

Description
称一个1,2,…,N的排列P1,P2…,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2.

计算1,2,…N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值
Input
输入文件的第一行包含两个整数 n和p,含义如上所述。
Output
输出文件中仅包含一个整数,表示计算1,2,⋯, n的排列中, Magic排列的个数模 p的值。
Sample Input
20 23
Sample Output
16
HINT
100%的数据中,1 ≤ N ≤ 106, P≤ 10^9,p是一个质数。

题目概述:求N个数的排列中满足P[i]>P[i/2]的个数。


题解:

拿到这道题一脸懵比,自己想了半天妄图用纯组合数学知识做出来。

问了问大佬,大佬说要用小根堆,吓得我直接就不是人了。

研究了一下,发现这道题其实就是求n个数组成的小根堆的个数。

写出来一个状态转移方程(搞得跟树归似的吓死个人):f[i]=f[i<<1]+f[i<<1|1]+C(size[i-1],size[i<<1]);

解释一下:上式中,size代表小根堆(其实就是一个树型的)以某一点为根节点的子树的大小。

f代表以当前节点为根节点的小根堆共有多少中排列方式。

$C_{size[i-1]}^{size[i<<1]}$代表的意义是:从比i大的数字中选出左儿子需要的个数插入到左子树中组成的一种排列。

其实$C_{size[i-1]}^{size[i<<1]}$和$C_{size[i-1]}^{size[i<<1|1]}$还是一样的。

size的累加过程:siz[i]=siz[i<<1]+siz[i<<1|1]+1;

我们发现,n的范围还是不小的(10的6次方),所以用到了Lucas定理。就这样啦~

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdlib>
using namespace std;
long long n,p,siz[],dp[];
long long fac[];
inline long long qpow(long long a,long long b)
{
register long long ans=;
a%=p;
while(b)
{
if(b&)
ans=ans*a%p;
a=a*a%p;
b>>=;
}
return ans;
}
inline long long C(long long nn,long long k)
{
if(k>nn)return ;
else
return fac[nn]*(qpow(fac[k]*fac[nn-k]%p,p-))%p;
}
inline long long Lucas(long long a,long long b)
{
if(b==)
return ;
return C(a%p,b%p)*Lucas(a/p,b/p)%p;
}
inline void getchart()
{
fac[]=fac[]=;
for(register long long i=;i<=n;i++)
fac[i]=(fac[i-]*i)%p;
return ;
}
int main()
{
scanf("%lld %lld",&n,&p);
getchart();
// cout<<fac[10]<<endl;
for(register int i=n;i>=;--i)
{
siz[i]=siz[i<<]+siz[i<<|]+;
dp[i]=Lucas(siz[i]-,siz[i<<]);
if((i<<)<=n)
dp[i]=(dp[i]*dp[i<<])%p;
if((i<<|)<=n)
dp[i]=(dp[i]*dp[i<<|])%p;
}
printf("%lld\n",dp[]);
return ;
}

代码在这里

「题解」:[组合数学]:Perm 排列计数的更多相关文章

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

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

  2. Perm排列计数(新博客试水,写的不好,各路大神见谅)

    B. Perm 排列计数 内存限制:512 MiB 时间限制:1000 ms 标准输入输出   题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i&l ...

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

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

  4. 「TJOI2015」组合数学 解题报告

    「TJOI2015」组合数学 这不是个贪心吗? 怎么都最小链覆盖=最大点独立集去了 注意到一个点出度最多只有2,可以贪心一下出度的去向 按读入顺序处理就可以,维护一个\(res_i\)数组,表示上一行 ...

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

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

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

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

  7. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  8. 「题解」「HNOI2013」切糕

    文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...

  9. 「题解」JOIOI 王国

    「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...

  10. 「bzoj1925」「Sdoi2010」地精部落 (计数型dp)

    「bzoj1925」「Sdoi2010」地精部落---------------------------------------------------------------------------- ...

随机推荐

  1. Area--->AreaRegistrationContext.MapRoute

    文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Area的使用 Area--->AreaRegi ...

  2. 解决ios10及以上Safari双击和双指缩放无法禁止的问题

    移动端web缩放有两种: 1.双击缩放: 2.双指手势缩放. 在iOS 10以前,iOS和Android都可以通过一行meta标签来禁止页面缩放 <meta content="widt ...

  3. json-lib 的maven dependency 一直找不到jar 包

    项目中要用到json-lib,mvnrepository.com查找它的dependency时结果如下: xml 代码 <dependency> <groupId>net.sf ...

  4. Jmeter----请求依赖之边界值提取器

    填写左边界和右边界 引用变量名就是要存储的变量名词

  5. myeclipse问题

    eclipse使用过程中发现汉字太小,几乎不可辨识. 更改办法:eclipse界面依次选择“window”–“preference”–“general”–“appearance”–“color and ...

  6. ARM GNU 专有符号

    1. @ 表示注释从当前位置到行尾的字符. 2. # 注释掉一整行. 3. ; 新行分隔符.

  7. JS去除字符串拼接末尾的符号(逗号)

    前言:在JS中,有时需要进行字符串的拼接,而拼接的字符串以某种符号分隔,在拼接好的字符串末尾会多出一个分隔符,这时我们可以采取以下几种方法来去除末尾的分隔符. 方法一:使用substring()  和 ...

  8. postman连接不了localhost问题解决

    学习搭建服务器可用postman 连接不了localhost的端口 网上好多教程是这样连接 看完视频后我们是这样 找了大量资料都解决不了,什么版本,什么证书的都不好使,最简单的就是去掉http:// ...

  9. [JZOJ3402] 【GDOI2014模拟】Pty的字符串

    题目 给你一棵每条边从父亲指向儿子的树,每条边上面有一个字母. 从树上的任意一点出发,走出的路径就是对应一个子串. (这不是\(Trie\),因为每个父亲可能会连出字母相同的边) 再给你一个字符串\( ...

  10. C++ BASS 实例

    #include <iostream> #include <string> #include <map> #include "..\sdk\bass\in ...