「题解」:[组合数学]:Perm 排列计数
题干:
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 排列计数的更多相关文章
- 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数
[BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...
- Perm排列计数(新博客试水,写的不好,各路大神见谅)
B. Perm 排列计数 内存限制:512 MiB 时间限制:1000 ms 标准输入输出 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i&l ...
- BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1936 Solved: 477[Submit][ ...
- 「TJOI2015」组合数学 解题报告
「TJOI2015」组合数学 这不是个贪心吗? 怎么都最小链覆盖=最大点独立集去了 注意到一个点出度最多只有2,可以贪心一下出度的去向 按读入顺序处理就可以,维护一个\(res_i\)数组,表示上一行 ...
- 2111: [ZJOI2010]Perm 排列计数
2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...
- bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)
bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- 「题解」「HNOI2013」切糕
文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...
- 「题解」JOIOI 王国
「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...
- 「bzoj1925」「Sdoi2010」地精部落 (计数型dp)
「bzoj1925」「Sdoi2010」地精部落---------------------------------------------------------------------------- ...
随机推荐
- <面试题>学习面试
1.代码中要修改不可变数据会出现什么问题? 抛出什么异常? 代码不会正常运行,抛出 TypeError 异常. # 比如修改元祖.会报错 TypeError: 'tuple' object does ...
- 11-python基础—格式化的两种方式
一.使用% %s 字符串 %c 字符 %d 十进制(整数) %i 整数 %u 无符号整数 %o 八进制整数 %x 十六进制整数 %X 十六进制整数大写 %e 浮点数格式1 %E 浮点数格式2 %f 浮 ...
- 应用Dubbo框架打造仿猫眼项目 理解微服务核心思想
1:传统应用带来的问题 单一业务开发的迭代问题 扩容困难 部署回滚困难2:微服务概述 微服务是一种将业务系统进一步拆分的架构风格 ...
- List<VO>转成List<Map>
List<A01090021BatchAddCheckVO> list = (ArrayList<A01090021BatchAddCheckVO>) result.get(& ...
- js只能输入数字和小数点
1.文本框只能输入数字代码(小数点也不能输入)<input onkeyup="this.value=this.value.replace(/\D/g,'')" onafter ...
- sparkStreaming结合SparkSql实例
SparkSQL结合SparkStreaming的使用 Flume+Kafka+SparkStreaming已经发展为一个比较成熟的实时日志收集与计算架构,利用Kafka,即可以支持将用于离线分析的数 ...
- vim 命令行模式 操作指令
复制n行: nyy 粘贴:p 剪切(删除)n行: ndd 剪切 ( 删除 ) n个字符:nx 移动光标到第一行 : gg 移动光标到最后一行 : G 设置格式 :gg=G 返回上一次操作前(撤销 ...
- 8_InlineHook
1 shellcode低2Gb警告.应使用高2GB 稳定 : 在内核挂钩子: 由于每个进程的低2gb 的数据是不同的:所以 在内核挂钩子 因该把 代码 放在 高 2gb. 方法1(申请): 比如 使用 ...
- TCP/IP协议,,OSI的七层参考模型,HTTP请求响应机制
一.TCP/IP协议 TCP/IP是Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是In ...
- COGS2356 【HZOI2015】有标号的DAG计数 IV
题面 题目描述 给定一正整数n,对n个点有标号的有向无环图进行计数. 这里加一个限制:此图必须是弱连通图. 输出答案mod 998244353的结果 输入格式 一个正整数n. 输出格式 一个数,表示答 ...