BZOJ2111: [ZJOI2010]Perm 排列计数-程序员宅基地

技术标签: 数据结构与算法  

BZOJ2111: [ZJOI2010]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,⋯, ���的排列中, Magic排列的个数模 p的值。

Sample Input

20 23

Sample Output

16

HINT

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


题解Here!

 

乍一看,感觉像一个数位$DP$。
然而本蒟蒻看完题解,发现了骚操作:
首先有个莫名其妙的定理:对于一个完全二叉树,如果父亲点权总是比儿子点权小,则构成了一个小根堆。
于是题目的意思就是:求有多少个大小为$n$的小根堆。
妙啊!
考虑动态规划求解。
设$dp[i]$表示有多少个大小为i的小根堆。
转移时考虑剩下的$i-1$个点中有$C_{i-1}^l$个点能作为左子树,剩下的点作为右子树。
即:$$dp[i]=C_{n-1}^l\times dp[l]\times dp[r]$$
组合数取模,$p\in prime$,果断卢卡斯。
然后并不知道为什么$WA$了两发。。。
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define MAXN 1000110
using namespace std;
int n;
long long m,p;
long long fact[MAXN],inv[MAXN],val[MAXN],dp[MAXN];
inline int read(){
	int date=0,w=1;char c=0;
	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
	return date*w;
}
long long mexp(long long a,long long b,long long c){
	long long s=1;
	while(b){
		if(b&1)s=s*a%c;
		a=a*a%c;
		b>>=1;
	}
	return s%c;
}
long long lucas(int n,int m,long long p){
	if(n<m)return 0;
	if(m>=p||n>=p)return lucas(n/p,m/p,p)%p*lucas(n%p,m%p,p)%p;
	return (fact[n]*inv[n-m]%p*inv[m]%p)%p;
}
void work(){
    for(int i=n;i>=1;i--){
        val[i]=1;
        if((i<<1)<=n)val[i]+=val[i<<1];
        if((i<<1)+1<=n)val[i]+=val[(i<<1)+1];
        if((i<<1)+1<=n)dp[i]=lucas(val[i]-1,val[i<<1],p)%p*dp[i<<1]%p*dp[(i<<1)+1]%p;
        else if((i<<1)<=n)dp[i]=dp[i<<1]%p;
        else dp[i]=1;
    }
    printf("%lld\n",dp[1]);
}
void init(){
    n=read();p=read();
    m=min((long long)n,p-1);
    fact[0]=1;
    for(int i=1;i<=m;i++)fact[i]=fact[i-1]*i%p;
    inv[m]=mexp(fact[m],p-2,p);
    for(int i=m-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%p;
}
int main(){
    init();
    work();
    return 0;
}

 

转载于:https://www.cnblogs.com/Yangrui-Blog/p/9482655.html

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

智能推荐

光流法运动目标检测-程序员宅基地

文章浏览阅读1.7w次,点赞10次,收藏210次。接上篇,OpenCV视频目标跟踪及背景分割器,本篇介绍OpenCV—python目标跟踪==》光流法回顾:目标跟踪是对摄像头视频中的移动目标进行定位的过程。实时目标跟踪是许多计算机视觉应用的重要任务,如监控、基于感知的用户界面、增强现实、基于对象的视频压缩以及辅助驾驶等。关于实现视频目标跟踪的方法有很多,当跟踪所有移动目标时,帧之间的差异会变的有用;当跟踪视频中移动的手时,基于皮肤颜色的均...

Sample of API FND_PROFILE_ebs fnd_profile (org)-程序员宅基地

文章浏览阅读5.5k次。1. FND_PROFILE.GET(‘Name of the Profile’, variable name);SELECT fnd_profile.value('PROFILEOPTION') ,fnd_profile.value('MFG_ORGANIZATION_ID') ,fnd_profile.value('ORG_ID') ,fnd_profile_ebs fnd_profile (org)

Pinpoint 技术架构及部署_pinponit 几个组件的关系-程序员宅基地

文章浏览阅读1.9w次,点赞2次,收藏29次。目录一、背景二、简介三、Pinpoint Collector 收集端四、Pinpoint Web五、Pinpoint Agent六、监控效果图七、其他一、背景随着项目微服务的进行,微服务数量逐渐增加,服务间的调用也越来越复杂,我们急切需要一个APM工具帮我们监控各个服务的性能及对服务间的调用进行跟踪,而通过调研多个开源APM工具后,最终我们选择了pintpoin..._pinponit 几个组件的关系

显式算法和隐式算法的并行化比较_显式算法和隐式算法的区别-程序员宅基地

文章浏览阅读9.4k次,点赞2次,收藏5次。1显式算法显式算法基本假定为:在一微小时间段内,模型任意点速度、加速度为常数。ABAQUS软件Explicit模块应用中心差分法对运动方程进行显式时间积分,运动方程的解为¨u(i)=M-1·(F(i)-I(i)) (1)式中:M 为集中质量矩阵;F 为外荷载向量;I 为单元内力向量。由于显式算法中不需要对刚度矩阵求逆,集中质量矩阵为对角矩阵,求逆简便,使显式算法并行计算数据传输_显式算法和隐式算法的区别

Embedded Linux S3C2440 Profiling_buildroot libts.so.0-程序员宅基地

文章浏览阅读431次。文章目录SummaryOProfile Applications and driverConfigure and Compile Busybox to support OprofileDownload the Kernel Image to S3C2440 boardCreate RootfsRecompile the Kernel ImageDownload the kernel image t..._buildroot libts.so.0

HTML+CSS实现一个线条爱心动画的效果_线条爱心代码-程序员宅基地

文章浏览阅读1.5k次。实践一个线条上下运动的动画页面代码:<!-- * @Author: OriginalCoder * @Date: 2020-10-17 10:12:51 * @version: * @LastEditTime: 2020-10-29 12:32:37 * @LastEditors: OriginalCoder * @Description: --><!DOCTYPE html><html lang="zh-CN"> <head>_线条爱心代码

随便推点

OpenGL入门(一) glfw ,glew,glut,freeglut区别_glew glfw glut-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏6次。glfw: GLFW is a free, Open Source, multi-platform library for opening a window, creating an OpenGL context and managing input. It is easy to integrate into existing applications and does not la_glew glfw glut

vba设置excel单元格背景色_vba 单元格背景颜色-程序员宅基地

文章浏览阅读722次,点赞9次,收藏7次。【VBA】给单元格设置背景色_vba 将一行底色置绿色-程序员宅基地。vba设置excel单元格背景色位蓝色。2024年1月16日。_vba 单元格背景颜色

VisionMaster SDK开发(C#,C++)的环境配置(最详细,最简单的环境配置)_visionmaster安装教程-程序员宅基地

文章浏览阅读3.7k次,点赞9次,收藏51次。VisionMaster作为一款优秀的视觉通用软件,自其问世以来以其优越的性能,简单的交互,美观的界面,易于上手等优点得到广大视觉应用与开发人员的一致好评。VM SDK开发作为visionmaster最常用的开发方式之一,也因其开发简单,开发效率高等优点而得到广泛应用。环境配置作为VM SDK开发的第一步,其重要性不言而喻,因此这里对机器视觉最常用的两种语言(C#、C++)的VM二次开发环境配置进行详细的总结。............_visionmaster安装教程

动态规划:买股票的最佳时机_动态规划选股-程序员宅基地

文章浏览阅读131次。给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。示例 2:_动态规划选股

Android R WindowManagerService 添加window过程分析 (一)_android addwindow分析-程序员宅基地

文章浏览阅读1.7k次。有一段时间没有在这边发博客了,之前的笔记都写在有道云笔记上. 使用有道随记还是不错的,但是通常缺乏体系. 后面会将之前的笔记整理总结出来.希望可以坚持下去吧, 加油.WIndowManagerService的内容相对来说比较庞杂, 需要花费很大气力才能真正理解它. 本篇是从添加window 的角度去分析它, 将它拆分为多个部分,进而层层分析.WindowManager#addView通常,我们都是通过WindowManager#addView方法来添加窗口. WindowManager的具体实现._android addwindow分析

python第三方库requests详解_python 三方库 requests-程序员宅基地

文章浏览阅读1k次。python第三方库requests详解Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Pyth..._python 三方库 requests

推荐文章

热门文章

相关标签