【题目链接】

http://www.lydsy.com/JudgeOnline/problem.php?id=2111

【题意】

给定n,问1..n的排列中有多少个可以构成小根堆。

【思路】

设f[i]为i个数的方案,设l为左子树大小r为右子树大小,则有:

f[i]=C(i-1,l)*f[l]*f[r]

因为是个堆,所以子树大小都是确定的,可以直接递推得到。

其中C(n,m) nm比较大,可以用lucas定理求。

模型建立的重要性可知一二。。。

【代码】

 #include<cstdio>
#include<iostream>
using namespace std; typedef long long ll;
const int N = 5e6+; int mod,n;
ll f[N],fac[N],s[N]; ll pow(ll a,ll p,int mod)
{
ll ans=;
while(p) {
if(p&) ans=(ans*a)%mod;
a=(a*a)%mod; p>>=;
}
return ans;
} void get_pre(int n)
{
fac[]=;
for(int i=;i<=n;i++)
fac[i]=(fac[i-]*i)%mod;
}
ll C(ll n,ll m,int mod)
{
if(n<m) return ;
if(n<mod&&m<mod) {
ll invn=pow(fac[n-m],mod-,mod);
ll invm=pow(fac[m],mod-,mod);
return fac[n]*invm%mod*invn%mod;
}
return C(n/mod,m/mod,mod)*C(n%mod,m%mod,mod)%mod;
} int main()
{
scanf("%d%d",&n,&mod);
get_pre(min(n,mod));
for(int i=n;i;i--) {
s[i]=s[i<<]+s[i<<|]+;
f[i]=C(s[i]-,s[i<<],mod);
if((i<<)<=n) f[i]=(f[i]*f[i<<])%mod;
if((i<<|)<=n) f[i]=(f[i]*f[i<<|])%mod;
}
printf("%lld\n",f[]);
return ;
}

bzoj 2111 [ZJOI2010]Perm 排列计数(DP+lucas定理)的更多相关文章

  1. 【bzoj2111】[ZJOI2010]Perm 排列计数 dp+Lucas定理

    题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Mogic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Mogic的,答案可能很 ...

  2. bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)

    bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...

  3. BZOJ 2111: [ZJOI2010]Perm 排列计数 [Lucas定理]

    2111: [ZJOI2010]Perm 排列计数 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1936  Solved: 477[Submit][ ...

  4. BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...

  5. bzoj 2111: [ZJOI2010]Perm 排列计数【树形dp+lucas】

    是我想复杂了 首先发现大于关系构成了一棵二叉树的结构,于是树形dp 设f[i]为i点的方案数,si[i]为i点的子树大小,递推式是\( f[i]=f[i*2]*f[i*2+1]*C_{si[i]-1} ...

  6. bzoj 2111: [ZJOI2010]Perm 排列计数 Lucas

    题意:称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很大, ...

  7. bzoj 2111: [ZJOI2010]Perm 排列计数

    神题... 扒自某神犇题解: http://blog.csdn.net/aarongzk/article/details/50655471 #include<bits/stdc++.h> ...

  8. 2111: [ZJOI2010]Perm 排列计数

    2111: [ZJOI2010]Perm 排列计数 链接 题意: 称一个1,2,...,N的排列$P_1,P_2...,P_n$是Magic的,当且仅当$2<=i<=N$时,$P_i> ...

  9. 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas

    [题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...

随机推荐

  1. 调整Linux的最大文件打开数

    要调整一下Linux的最大文件打开数,否则squid在高负载时执行性能将会很低.另外,在Linux下面部署应用时,有时候会遇上 Socket/File:Can’t open so many files ...

  2. 如何在Sql Server 2000中用一条语句实现树的查询

    以公司的网站栏目表为例,表结构(表名:Subject)如下:   字段名称 字段类型 字段长度 id int 4 NAME varchar 200 PARENTID int 4 CODE varcha ...

  3. gitlab账号注册及分组

    .开启注册邮箱验证 admin area -->setting-->Sign-up restrictions-->勾选Send confirmation email on sign- ...

  4. mysql数据优化--数据库结构的优化

    1,比如存时间类型的就使用int类型   其中mysql的两个函数可以拿来使用 unix_timestamp 将时间日期转化为时间戳

  5. dstat 监控时,无颜色显示

    linux:Centos 6.6 dstat:0.7.0 注意,有这个提醒:Color support is disabled, python-curses is not installed good ...

  6. spring 中 ThreadPoolTaskExecutor 的使用

    配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  7. hibernate关联关系

    hibernate是一个强大的ORM框架,为了使用面向对象的方式管理数据库,hibernate提供了4中关系设置: 1.一对一 (one-to-one) 2.一对多 (one-to-many) 3.多 ...

  8. BZOJ 3498 PA2009 Cakes

    本题BZOJ权限题,但在bzojch上可以看题面. 题意: N个点m条无向边,每个点有一个点权a. 对于任意一个三元环(i,j,k)(i<j<k),它的贡献为max(ai,aj,ak) 求 ...

  9. Java应用中使用ShutdownHook友好地清理现场

    在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.Java中得ShutdownHook提供了比较好的方案. JDK在1.3之后提 ...

  10. 初探Java 9 的的模块化

    Java 9中最重要的功能,毫无疑问就是模块化(Module),它将自己长期依赖JRE的结构,转变成以Module为基础的组件,当然这在使用Java 9 开发也和以前有着很大的不同. Java8或更加 ...