Perm排列计数(新博客试水,写的不好,各路大神见谅)
B. Perm 排列计数
题目描述
称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大,只能输出模P以后的值
输入格式
输入文件的第一行包含两个整数 n和p,含义如上所述。
输出格式
输出文件中仅包含一个整数,表示计算1,2,?, ???的排列中, Magic排列的个数模 p的值。
样例
样例输入
20 23
样例输出
16
数据范围与提示
100%的数据中,1 ≤ ??? N ≤ 106, P??? ≤ 10^9,p是一个质数。 数据有所加强
题解
刚拿到这道题的时候没什么思路,但脑子啊有时候吧~~
可以把这个题想象成一棵二叉树,下标即在排列中的位置,当然1为根
一个点的任意一个子孙一直除2的话最终都会到该点,即在以该点为根的子树内,该点值最小
假设有n个点,父亲要最小的那一个,左右儿子各自成家,互不干扰,左儿子要剩下的n-1个中的m个,剩下的都给了右儿子一家,组合数为C(n-1,m),向下一个个分下去你会发现
转移式为 f[爹]=f[左儿子]*f[右儿子]*C(size[],size[]) f[]表示满足条件的组合数,size[]表示以该点为根的树的大小
因为n有点大,n!会炸掉,所以求组合数的时候上Lucas定理就欧了
弱弱的Lockey死活不用Lucas(我牛逼,我伟大),一直在搞高精乘低精,高精除低精,但还是在强悍的Lucas面前献上了膝盖%%%%
#include<iostream>
#include<cstdio>
using namespace std;
int n,p,son[],d[];
long long ans=;
long long pow(long long a,long long b,long long p){
long long ans=;
a%=p;
while(b){
if(b&) ans=(ans*a)%p;
b>>=;
a=(a%p)*(a%p)%p;
}
ans%=p;
return ans;
}
long long inv(long long x,long long p){
return pow(x,p-,p);
}
long long C(long long n,long long m){
if(m>n) return ;
long long up=,down=;
for(int i=n-m+;i<=n;i++) up=up*i%p;
for(int i=;i<=m;i++) down=down*i%p;
return up*inv(down,p)%p;
}
long long Lucas(long long n,long long m,long long p){
if(m==) return ;
return C(n%p,m%p)*Lucas(n/p,m/p,p);
}
void dfs(int x){
if(*x<=n) dfs(*x);
if(*x+<=n) dfs(*x+);
son[x]=son[*x]+son[*x+]+;
if(son[x]>){
ans=(long long)(ans%p)*(long long)(Lucas(son[x]-,son[*x]?son[*x]:son[*x+],p)%p)%p;
}
return;
}
int main(){
scanf("%d%d",&n,&p);
if(n==){
cout<<%p;
return ;
}
dfs();
cout<<ans%p;
}
Perm排列计数(新博客试水,写的不好,各路大神见谅)的更多相关文章
- 欢迎阅读daxnet的新博客:一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为"希赛网" ...
- 关于新世界的大门(新博客地址:BBBob.cf)
更新:BBBob.cf 这个域名已经不用了(但是依旧可以访问),永久域名改为了BBBob.win 新博客地址为BBBob.cf,以后的博客都会在新博客更新,当然在新博客上我也会写得更用心些,不再像这里 ...
- [译]:Orchard入门——给网站添加新博客
原文链接:Adding a Blog to Your Site 文章内容基于Orchard 1.8版本 Orchard提供一个博客引擎--这让添加一个新博客到你网站变得非常容易. 本文将介绍怎样添加一 ...
- 我的新博客:www.wangyufeng.org
新博客:www.wangyufeng.org 博客园的博客不更新啦.
- imfong.com,我的新博客地址
imfong.com新博客采用jekyll+Github搭建,欢迎访问.
- 新博客,新开始-从Chrome浏览器奔溃说起
新博客,新开始 今天是2015-04-09,昨天新开的博客,今天在这写上一段,算是立个标记,好留以后拿来回溯吧. 不知道是谁跟我说的,坚持写博客是个好习惯,也能帮助自己总结经验,提高技术.也许大概可能 ...
- BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]
2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1936 Solved: 477[Submit][ ...
- 2111: [ZJOI2010]Perm 排列计数
2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...
- 这里已不再更新,访问新博客请移步 http://www.douruixin.com
这里已不再更新,访问新博客请移步 http://www.douruixin.com
随机推荐
- 零元学Expression Blend 4 - Chapter 35 讨厌!!我不想一直重复设定!!『Template Binding』使用前後的差异
原文:零元学Expression Blend 4 - Chapter 35 讨厌!!我不想一直重复设定!!『Template Binding』使用前後的差异 因为先前写到自制Button时需特别注意T ...
- C语言实现的CRC16/CCITT-FALSE校验码函数
要求:输入字符串“00 AA FF CC AA 01 00” 得到校验码“79B1” 方法1: // ConsoleApplication1.cpp: 定义控制台应用程序的入口点. // #inclu ...
- 什么是AIFF?
AIFF是音频交换文件格式(Audio Interchange File Format)的英文缩写,是Apple公司开发的一种声音文件格式,被Macintosh平台及其应用程序所支持,Netscape ...
- asp.net ToString() 格式化字符串
c# ToString() 格式化字符串 格式化数值:有时,我们可能需要将数值以一定的格式来呈现,就需要对数值进行格式化.我们使用格式字符串指定格式.格式字符串采用以下形式:Axx,其中 A 为格式 ...
- SendMessage发送自定义消息及消息响应(VC版)
控件向父窗体发送自定义消息,父窗体定义处理此消息的函数 程序源代码(整个工程)下载:http://download.csdn.net/detail/qq2399431200/6274793 效果描述 ...
- Python正则表达式进阶-零宽断言
1. 什么是零宽断言 有时候在使用正则表达式做匹配的时候,我们希望匹配一个字符串,这个字符串的前面或后面需要是特定的内容,但我们又不想要前面或后面的这个特定的内容,这时候就需要零宽断言的帮助了.所谓零 ...
- DNS之缓存服务器部署流程
环境介绍 [root@dns ~]# cat /etc/centos-releaseCentOS release 6.6 (Final)[root@dns ~]# ifconfig eth0|sed ...
- sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)
问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...
- 系统学习 Java IO (七)----字节数组流 ByteArrayInputStream/ByteArrayOutputStream
目录:系统学习 Java IO---- 目录,概览 ByteArrayInputStream 如果数据存储在数组中,ByteArrayInputStream 可以很方便读取,它可以返回 InputSt ...
- PHP输出缓冲及其应用
缓冲(buffer)是为了协调吞吐速度相差很大的设备之间数据传送而采用的技术,用来存放缓冲数据的区域叫缓冲区,在计算机科学领域,当数据从一个地方传送到另一个地方时,缓冲区被用来临时存储数据.与缓冲相似 ...