zoukankan      html  css  js  c++  java
  • 【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是素数。
    【算法】计数DP+排列组合+lucas
    【题解】令i的父亲为i/2,转化为要求给一棵n个点的完全二叉树编号使得儿子编号>父亲编号。
    (f[i])表示以第i个点为根的子树的编号方案数(1~sz[i]的排列),考虑从两个儿子处转移。
    排列的本质是大小关系,所以两个排列组合起来相当于对1~sz[i<<1]和1~sz[i<<1|1]进行任意组合(各自保持顺序),然后从头到尾重编号成1~sz[i<<1]+sz[i<<1|1]。再将新的编号分配回去。
    两个固定排列组合的方案数实际上是将sz[i<<1|1]个“1”分成sz[i<<1]+1份的方案数,采用隔板法易得C(sz[i<<1]+sz[i<<1|1],sz[i<<1]),再枚举两个排列,即:

    [f[i]=f[l_i]*f[r_i]*inom{sz[i]-1}{sz[l_i]} ]

    为了方便看,这里(l_i=i<<1)(r_i=i<<1|1)
    由于模数p可能比n小,会导致没有逆元,所以预处理1~min(n,p-1)的阶乘,然后用lucas求解组合数。
    复杂度(O(n))
    注意:n较大时线性预处理阶乘逆元保证复杂度,f数组全部初始化为1。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=2000010;//
    int n,MOD,fac[maxn],fav[maxn],sz[maxn],f[maxn];
    void gcd(int a,int b,int &x,int &y){if(!b){x=1;y=0;}else{gcd(b,a%b,y,x);y-=x*(a/b);}}
    int inv(int a){int x,y;gcd(a,MOD,x,y);return (x%MOD+MOD)%MOD;}
    int c(int n,int m){return 1ll*fac[n]*fav[m]%MOD*fav[n-m]%MOD;}
    int lucas(int n,int m){
    	if(n<0||m<0||n<m)return 0;
    	if(n<MOD)return c(n,m);
    	return 1ll*c(n%MOD,m%MOD)*lucas(n/MOD,m/MOD)%MOD;
    }
    int main(){
    	scanf("%d%d",&n,&MOD);int mx=min(MOD-1,n);
    	fac[0]=1;for(int i=1;i<=mx;i++)fac[i]=1ll*fac[i-1]*i%MOD;
    	fav[mx]=inv(fac[mx]);for(int i=mx;i>=1;i--)fav[i-1]=1ll*fav[i]*i%MOD;///
    	for(int i=1;i<=(n<<1|1);i++)f[i]=1;
    	for(int i=n;i>=1;i--){
    		sz[i]=sz[i<<1]+sz[i<<1|1]+1;
    		f[i]=1ll*f[i<<1]*f[i<<1|1]%MOD*lucas(sz[i]-1,sz[i<<1])%MOD;//
    	}
    	printf("%d",f[1]);
    	return 0;
    }
  • 相关阅读:
    微服务概述
    Airflow 配置celery+rabbitmq和celery+redis
    CentOS7安装Airflow
    Python如何import其它.py文件及其函数
    ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    CentOS7安装MySQL
    Hadoop完全分布式环境下,DataNode进程正常启动,但是网页上不显示DataNode节点
    <一> windbg简介
    几个资料下载网站
    使用VS2012 C++ 进行单元测试
  • 原文地址:https://www.cnblogs.com/onioncyc/p/9049728.html
Copyright © 2011-2022 走看看