「题解」:[组合数学]: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」地精部落---------------------------------------------------------------------------- ...
随机推荐
- 面试总结【css篇】- 盒子模型
题目:谈谈你对CSS盒模型的认识 (1) 基本概念:标准模型+IE模型 (2) 标准模型和IE模型区别 标准模型和IE模型的区别,就是宽度和高度的计算方式不同. 标准模型的宽度指的就是conten ...
- parallels desktop虚拟机与Mac共享网络设置方法
查看vnic0的ip centos7设置ip parallels desktop偏好设置 最后可以互ping 也可以ping外网
- 【POJ】2492 A Bug's Life
题目链接:http://poj.org/problem?id=2492 题意:给你n个虫子,m组实验.让你帮科学家找一下有没有虫子是同性恋. 题解:假设x是一个性别,x+n为另一个性别.如果在同性的集 ...
- (十三)在ASP.NET CORE中使用Options
这一节介绍Options方法,继续在OptionsBindSample项目下. 在项目中添加一个Controllers文件夹,文件夹添加一个HomeController控制器 HomeControll ...
- 什么是哈希Hash(散列函数)
Hash(散列函数) Hash,一般翻译做散列.杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就 ...
- soapui打开即报错------连接不上Internet
1.遇到的问题: 打开soapui即报错,如下: You're getting this message since your computer is offline and SoapUI can't ...
- css实现单行、多行文本溢出显示省略号(…)
一.单行文本溢出显示省略号(…) 省略号在ie中可以使用text-overflow:ellipsis了,但有很多的浏览器都需要固定宽度了,同时ff这些浏览器并不支持text-overflow:elli ...
- 关于FR4板一些重复的数据
介电常数:4.2-4.7 信号传输速度:表层 140~170 ps/inch, 内层 180 ps/inch
- The Preliminary Contest for ICPC Asia Nanjing 2019 C. Tsy's number 5
https://nanti.jisuanke.com/t/41300 题意:求\(\sum_{i=1}^n\phi(i)\phi(j)2^{\phi(i)\phi(j)}\) \(f_i=\sum_{ ...
- 计算几何——圆卡精度cf1059D
double 在1e17以后就不能顾及小数,所以用一下加精度的技巧 sqrt(r*r-d*d)=sqrt(r+d)*sqrt(r-d) 遇到误差在几位以内的注意要修改二分的精度,用最大的数据去乘以精度 ...