bzoj2111 Perm 排列计数-程序员宅基地

称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值

Input

输入文件的第一行包含两个整数 n和p,含义如上所述。

Output

输出文件中仅包含一个整数,表示计算1,2,⋯, �的排列中, Magic排列的个数模 p的值。

Sample Input

20 23

Sample Output

16

Hint

 

100%的数据中,1 ≤ � N ≤ 106, P� ≤ 10^9,p是一个质数。 数据有所加强

 

题解:题目意思比较好理解,就是问你有多少种小根堆,那么根可以确定,然后左边右边就是

组合一下,确定,如果只有一个点,那么方案数就为1,size为1,不然就是左右子树合并。

这样瞎搞。。。(⊙o⊙)…,就好了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define N 1000007
 7 #define M 1007
 8 #define ll long long
 9 using namespace std;
10 
11 int n,p;
12 ll fac[N],ni[N],f[N];
13 int siz[N];
14 
15 ll C(int n,int m)
16 {
17     if(m>n) return 0;
18     if(n<p) return fac[n]*ni[m]%p*ni[n-m]%p;
19     return C(n/p,m/p)*C(n%p,m%p)%p;
20 }
21 int main()
22 {
23     int i;
24     scanf("%d%d",&n,&p);
25     fac[0]=ni[0]=ni[1]=1;
26     
27     for(i=1;i<=n&&i<p;i++)
28         fac[i]=fac[i-1]*i%p;
29     for(i=2;i<=n&&i<p;i++)
30         ni[i]=(p-p/i)*ni[p%i]%p;
31         
32     for(i=2;i<=n&&i<p;i++)
33         (ni[i]*=ni[i-1])%=p;
34     for(i=n;i>=1;i--)
35     {
36         if(i*2+1<=n)
37         {
38             siz[i]=1+siz[i*2]+siz[i*2+1];
39             f[i]=f[i*2]*f[i*2+1]%p*C(siz[i]-1,siz[i*2])%p;
40         }
41         else if(i*2<=n)
42         {
43             f[i]=f[i*2];
44             siz[i]=1+siz[i*2];
45         }
46         else
47         {
48             f[i]=1;
49             siz[i]=1;
50         }
51     }
52     printf("%lld\n",f[1]);
53 }

 

转载于:https://www.cnblogs.com/fengzhiyuan/p/7588539.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30693683/article/details/97930828

智能推荐

电脑自动重启的原因几处理方法_数据库量大电脑重启-程序员宅基地

文章浏览阅读2.4k次。一、软件☆1.病毒破坏自从有了计算机以后不久,计算机病毒也应运而生。当网络成为当今社会的信息大动脉后,病毒的传播更加方便,所以也时不时的干扰和破坏我们的正常工作。比较典型的就是前一段时间对全球计算机造成严重破坏的“冲击波”病毒,发作时还会提示系统将在60秒后自动启动。其实,早在DOS时代就有不少病毒能够自动重启你的计算机对于是否属于病毒破坏,我们可以使用最新版的杀毒软件进行杀毒,一般都会发现病毒存_数据库量大电脑重启

一个函数产生0/1的概率为 二分之一, 如何生成一个新函数使得产生0的概率为十分之三 产生1的概率为十分之七_已知一个函数f() 可以生成0或1,概率为1/2 让你实现一个函数生成1的概率为p-程序员宅基地

文章浏览阅读3.3k次。转自出处(1) 有一个函数fun能返回0和1两个值,返回0和1的概率都是1/2,问怎么利用这个函数得到另一个函数fun2,使fun2也只能返回0和1,且返回0的概率为0.3,返回1的概率为0.7。 分析: Nathan 16:42:59随机生成长度为4的01串0000~1111每个串出现的概率都为1/16Nathan 16:44_已知一个函数f() 可以生成0或1,概率为1/2 让你实现一个函数生成1的概率为p

今天开始程序员不用再发愁写commit message了,全部由CodeGeeX自动完成!_codegeex生成commit message-程序员宅基地

文章浏览阅读213次。当你在 IDE 中进行代码修改并准备提交时,在代码管理器中,点击CodeGeeX的图标。CodeGeeX会自动分析你的代码变更,并根据 Git Diff 信息生成建议的提交消息。还可以在设置中选择commit message的生成风格,确保了提交消息的一致性和规范性。它的使用方法非常简单,首先在你的VSCode插件市场中,搜索“CodeGeeX”智能编程助手,下载安装。CodeGeeX支持通过git diff信息,自动生成commit message,并成功提交。“这个功能真的是用了,就再也停不下来了!_codegeex生成commit message

python中默认的包安装路径为国外地址,直接安装出现报错,怎么切换成国内镜像网址(清华镜像、阿里云镜像以及中科大镜像)_中科大镜像源-程序员宅基地

文章浏览阅读571次,点赞8次,收藏7次。新手在python中安装包的时候常遇到安装镜像的网站地址问题,导致安装包失败。下面给大家介绍几个国内常用的镜像地址:一、清华镜像。二、中科大镜像。三、阿里云镜像_中科大镜像源

将hdfs文件加入hive分区表中_hdfs文件数据映射到hive 分区-程序员宅基地

文章浏览阅读2.3k次。先把文件放入hdfs,或用flume采集到hdfs,参看另一篇,再把hdfs文件加载到hive表中alter table ods_nshop.ods_01_releasedatas add partition (bdp_day='20191215') location 'hdfs://hadoop01:9000/data/nshop/ods/release/bdp_day=20191215'..._hdfs文件数据映射到hive 分区

skp、fbx、obj在线转gltf_fbx怎么转gltf-程序员宅基地

文章浏览阅读543次,点赞7次,收藏6次。支持skp,fbx,obj在线转换为轻量化格式gltf_fbx怎么转gltf

随便推点

《深入解析 MAC OS X & iOS 操作系统》PDF 带书签_深入理解mac os x & ios操作系统 pdf-程序员宅基地

文章浏览阅读5.9k次。内容简介······《深入解析Mac OS X & iOS操作系统》编著者莱文。系统开发者、内核黑客和对苹果感到好奇的人们注意了!本书探讨了MacOSX系统和iOS系统的方方面面,深入讲解了两个系统的架构,讨论了框架手册没有讨论的内容。本书清晰而详细地讨论了苹果操作系统的内部工作原理,包括苹果私有的API,书中的大部分内容都是首次披露。《深入解析Mac OS X ..._深入理解mac os x & ios操作系统 pdf

华为Mate60和小米13参数对比 哪个值得买_小米13和华为mate60-程序员宅基地

文章浏览阅读964次。从CMOS的尺寸来看,它的这颗主摄和小米13差不多,同样都拥有1/1.56英寸的底,但华为凭借特别的RYYB特性和F1.4-F4.0可变光圈技术,它的主摄进光量要大于小米13,无论是夜间还是白天的拍照画质都有优势。终于回到小米13的主场了,它采用的是骁龙8Gen2处理器+LPDDR5X内存+UFS4.0存储的组合,从实测来看,它的性能表现在骁龙8Gen2手机中都算出色的那一类,大型游戏场景的帧率高,日常应用的流畅度也高,并且发热控制得较好,整体的性能感受非常好。小米13 更多使用感受和评价。_小米13和华为mate60

【BS学习】——B/S结构_b/s架构好学吗-程序员宅基地

文章浏览阅读5.3k次。未完待续_b/s架构好学吗

Linux驱动:网卡驱动分析之三--MAC驱动及PHY驱动框架了解_linux驱动 网卡mac通讯-程序员宅基地

文章浏览阅读3.4k次,点赞4次,收藏31次。1、前言在了解网卡驱动之前,推荐先看linux内核网络分层结构这篇文章,这里就摘取文章中的两张关于网络数据包的流程图(UDP示例),方便后面网络设备驱动程序的了解:数据结构说明:内核对网络数据包的处理都是基于sk_buff结构的,该结构是内核网络部分最重要的数据结构;对于网络设备驱动比较重要的一部分就是net_device结构体,在include/linux/netdevices.h中定义。(文章只是简单了解驱动框架,没有深入分析)2、MAC控制器驱动程序对于imx6ull的MAC控制_linux驱动 网卡mac通讯

编写程序,设计一个学生类Student和它的子类Undergraduate_设计一个学生类student和它的一个子类-程序员宅基地

文章浏览阅读7k次,点赞8次,收藏14次。编写程序,设计一个学生类Student和它的子类Undergraduate编写程序,设计一个学生类Student和它的子类Undergraduatepackage 一个题2020_3_31;/** * 学生类 * @author 马志勇 * @version V 1.0 * 许昌学院 * 互祝 互助 互注 *..._设计一个学生类student和它的一个子类

少儿Python每日一题(23):楼梯问题_python走楼梯一步三种走法问题-程序员宅基地

文章浏览阅读2.7k次。本次的题目如下所示:楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,走完n阶台阶共有多少种不同的走法?输入格式:输入楼梯的阶梯数n输出格式:输出不同走法的个数输入样例:10输出样例:89这是一道非常经典的题目,我们可以先寻找一下上楼梯的规律。题目告诉了我们,一次可以上1阶,也可以上2阶。如果楼梯只有1阶,那很明显只有1种方法;如果楼梯有2阶,我们可以先跨1阶、再跨1阶,也可以直接跨2阶,有2种方法。当有3个台阶的时候,我们要么先上到第1阶,然后再上2阶;_python走楼梯一步三种走法问题

推荐文章

热门文章

相关标签