题干:

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. NetBeans简介和简单使用

    1.什么是NetBeans? NetBeans IDE:可以使开发人员利用Java平台能够快速创建Web.企业.桌面以及移动的应用程序: 支持语言:PHP.Ruby.JavaScript.Groovy ...

  2. Area--->AreaRegistrationContext.MapRoute

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

  3. Unity中DoTween的使用

    在Unity手游开发中,经常用到插值运算,我们可以使用Mathf.Lerp自行去实现效果,但是使用插件提高了我们的开发效率,这里归结一下DoTween的基本使用方式以及效果说明: 直接代码: usin ...

  4. 转: https原理:证书传递、验证和数据加密、解密过程解析

    原本连接:http://www.cnblogs.com/zhuqil/archive/2012/07/23/2604572.html 我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很 ...

  5. Java中怎样实现字符串截取

    使用substring()对字符串进行截取: /** * str.indexOf()查找下标 * substring();//字符串截取 * length();//字符串长度 * */ @Test p ...

  6. leetcode-第10周双周赛-5099验证回文字符串③

    题目描述: 方法:动态规划 class Solution: def isValidPalindrome(self, s: str, k: int) -> bool: def isKPalRec( ...

  7. 选择器zuoye

    代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title ...

  8. windows 嵌入控制台

    { 实际非常简单 需要控制台的hwnd 和 hdc 能获取控制台的hwnd 那hdc 就出来了 有了hdc 还有什么不能干的呢?? 如果会win32 窗口编程的就知道hdc,是一个让人流口水的类型 } ...

  9. C/C++ Microsoft Visual Studio c++ DOC Home

    { // https://docs.microsoft.com/zh-cn/cpp/overview/visual-cpp-in-visual-studio?view=vs-2017 // https ...

  10. Jmeter-BeanShell断言:将数据库结果封装成list作为参数

    import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjso ...