「题解」:[组合数学]: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[4000006],dp[4000006];
long long fac[40000006];
inline long long qpow(long long a,long long b)
{register long long ans=1;a%=p;while(b){if(b&1)ans=ans*a%p;a=a*a%p;b>>=1;}return ans;
}
inline long long C(long long nn,long long k)
{if(k>nn)return 0;elsereturn fac[nn]*(qpow(fac[k]*fac[nn-k]%p,p-2))%p;
}
inline long long Lucas(long long a,long long b)
{if(b==0)return 1;return C(a%p,b%p)*Lucas(a/p,b/p)%p;
}
inline void getchart()
{fac[1]=fac[0]=1;for(register long long i=2;i<=n;i++)fac[i]=(fac[i-1]*i)%p;return ;
}
int main()
{scanf("%lld %lld",&n,&p);getchart();
//    cout<<fac[10]<<endl;for(register int i=n;i>=1;--i){siz[i]=siz[i<<1]+siz[i<<1|1]+1;dp[i]=Lucas(siz[i]-1,siz[i<<1]);if((i<<1)<=n)dp[i]=(dp[i]*dp[i<<1])%p;if((i<<1|1)<=n)dp[i]=(dp[i]*dp[i<<1|1])%p;}printf("%lld\n",dp[1]);return 0;
}
代码在这里

 

转载于:https://www.cnblogs.com/xingmi-weiyouni/p/11131530.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最受欢迎的java技术_最受欢迎的Java环境

最受欢迎的java技术该职位将是即将发布的系列文章中的第一篇。 我们从所使用的环境开始&#xff1a;如果您感兴趣的是最受欢迎的JVM供应商或JVM版本&#xff0c;那么32bit是比64bit更流行的体系结构&#xff0c;还是Windows 8比Windows XP更流行的体系结构-这些都将在我们的文章…

DT-06 For MQTT

感谢关注深圳四博智联科技有限公司产品&#xff01;我公司提供完整的WiFi信号强度采集方案&#xff0c;包括WiFi信号采集、设备远程管理平台、智能终端应用等。 Doit_MQTT透传固件基于乐鑫ESP_IOT_SDK使用C编写&#xff0c;代码执行效率高。经过多个版本迭代&#xff0c;可靠性…

@async 没有异步_扒一扒VueCLI3.0中Axios异步请求同步化

前台经常会遇到请求同步和异步的问题&#xff0c;今天咱们来聊一聊vue中同步请求和异步请求那些事儿。说到接口的请求同步和异步问题&#xff0c;最早接触Ajax中就存在&#xff0c;Ajax传递的参数有一个async&#xff0c;默认情况下是false&#xff0c;也就是异步传输的&#x…

Java Platform Module系统中的可选依赖项

Java平台模块系统&#xff08;JPMS&#xff09;对依赖项有很强的见解&#xff1a;默认情况下&#xff0c;需要&#xff08;必须可访问&#xff09;它们&#xff0c;然后在编译时和运行时都将它们存在。 但是&#xff0c;这不适用于可选的依赖项&#xff0c;因为代码是针对运行时…

sqoop导出solr数据_Apache Atlas - 强大的元数据管理工具

构建和安装Apache Atlas构建Apache Atlas下载 Apache Atlas 1.0.0 发行版源码, apache-atlas-1.0.0-sources.tar.gz, 从 downloads 下载. 然后按照以下说明构建Apache Atlas。tar xvfz apache-atlas-1.0.0-sources.tar.gz cd apache-atlas-sources-1.0.0/ export MAVEN_OPTS&qu…

Mac入门--如何使用brew安装多个PHP版本

一 安装7.1 1. 安装PHP7.1 brew install php7.12. 修改配置 php-fpm.conf,一般在/usr/local/etc/php下(如果php-fpm.conf中不存在&#xff0c;则查找php-fpm.d目录) vim php-fpm.conflisten 127.0.0.1:90003. 启动PHP7.1 brew services start php7.14. 这时php-fpm会监听9000端…

python单例模式继承_python单例模式

单例模式是常见的一种设计模式&#xff0c;它是针对类的一种描述&#xff0c;因此&#xff0c;我们可以使用python的decorator来实现通用的单例模式。一.基本的单例模式首先建立我们的decorator。我们需要为classType建立_instance和_lock成员&#xff1a;Pythondef singleton(…

[MEGA DEAL]完整的Java编程训练营(94%)

成为Java Master的10门课程&#xff08;83.5小时&#xff09;&#xff1a;使用JavaFX的设计UI&#xff0c;利用设计模式&#xff0c;Master Multithreading等 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价…

【洛谷 1879】玉米田

题目描述农场主John新买了一块长方形的新牧场&#xff0c;这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12)&#xff0c;每一格都是一块正方形的土地。John打算在牧场上的某几格里种上美味的草&#xff0c;供他的奶牛们享用。遗憾的是&#xff0c;有些土地相当贫瘠&#xf…

echarts的tree怎么控制位置_自动化考研保研面试—线性系统控制器设计

这个问题是我导师&#xff08;面试组长&#xff09;多次在保研考研面试的时候问过的&#xff0c;而且每年都会问&#xff01;问题其实不难&#xff0c;涉及的知识点也就是自控原理经典控制理论的部分&#xff0c;但是基本上很少有人能够完整地回答出来&#xff0c;不服的话请看…

PCF上的Spring Cloud合同和Spring Cloud Services

最近&#xff0c;我们有一个客户&#xff0c;对于使用Spring Cloud Contract &#xff08;SCC&#xff09;来防止微服务团队之间的API“漂移”&#xff0c;微型开发团队需要由单个开发团队来照顾构成企业应用程序一部分的单个API的想法非常感兴趣。 Spring Cloud Contract是Sp…

MS Lync2010客户端开发体会

和前身OCS2007 相比较&#xff0c;Lync2010原生客户端的扩展性大大缩小了&#xff0c;但是提供了很好的客户端SDK&#xff0c;整个系统架构也有较大变化。由于Lync2010原生客户端实在太简单&#xff0c;用惯了QQ的国人&#xff0c;实在无法接受以下功能的缺失&#xff1a; 组织…

date javascript 时区_第23节 Datejs 日期库-Web前端开发之Javascript-零点程序员-王唯

Datejs 是一个开源的JavaScript库&#xff0c;用来解析、格式化和处理日期数据&#xff0c;支持多种语言的日期格式处理&#xff1b;官网&#xff1a;www.datejs.com/Moment.js 是一个简单易用的轻量级JavaScript日期处理类库&#xff0c;提供了日期格式化、日期解析等功能。它…

制杖题

题目描述 求不大于 m 的、 质因数集与给定质数集有交集的自然数之和。 输入格式 第一行二个整数 n&#xff0c;m。 第二行 n 个整数&#xff0c;表示质数集内的元素 p[i]。 输出格式 一个整数&#xff0c;表示答案&#xff0c;对 376544743 取模。 输入输出样例 输入 #1复制 2 …

煤矿安全规程专家解读2016电子版_【学习】煤矿安全规程专家解读(165)

点击蓝字关注我们第二编 井工部分第三百三十三条爆破前&#xff0c;必须加强对机器、液压支架和电缆等的保护或将其移出工作面。爆破前&#xff0c;班组长必须亲自布置专人在警戒线和可能进入爆破地点的所有通路上担任警戒工作。警戒人员必须在安全地点警戒。警戒线处应设置警…

DC / OS中具有Java和数据库应用程序的服务发现

该博客将展示一个简单的Java应用程序如何使用DC / OS中的服务发现与数据库进行对话。 为什么要进行服务发现&#xff1f; 应用程序通常由多个组件组成&#xff0c;例如应用程序服务器&#xff0c;数据库&#xff0c;Web服务器&#xff0c;缓存和消息传递服务器。 通常&#xf…

RAC环境下创建本地数据文件的解决方法

引用收藏&#xff1a;http://blog.itpub.net/501889/viewspace-1083311/ 同事不小心&#xff0c;在RAC环境下创建了本地数据文件&#xff0c;这个肯定会出问题的&#xff0c;节点2不能访问此数据文件。其实发现做错了&#xff0c;立马删掉应该没有问题。数据文件还没有数据。下…

诺基亚n1平板电脑刷机教程_【个人记事本】闲鱼购买平板的经历

今年由于疫情原因&#xff0c;国内开展了全体学生在家学习的模式&#xff0c;这就避免不了老师发一些课件&#xff0c;还有一些录课的视频等电子学习资料等。考虑到开学复习的便利性&#xff08;平板比笔记本电脑更具有便携性&#xff0c;更方便&#xff09;。所以&#xff0c;…

找出一个字符串中出现次数最多的字_487,重构字符串

想了解更多数据结构以及算法题&#xff0c;可以关注微信公众号“数据结构和算法”&#xff0c;每天一题为你精彩解答。问题描述给定一个字符串S&#xff0c;检查是否能重新排布其中的字母&#xff0c;使得两相邻的字符不同。若可行&#xff0c;输出任意可行的结果。若不可行&am…

一、数据设计规范

一、数据设计规范 1、表的前缀 1、表名称不应该取得太长&#xff08;一般不超过三个英文单词。不推荐使用中文拼音&#xff0c;总的长度不要超过30个字符&#xff09; 格式:Tbl_Wms_log 表示 表_Wms系统_log 好处:执行查询方式辨别SQL类别(T_表-Table、V_视图-View、S_存储过…