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

Posted guangheli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 2111: [ZJOI2010]Perm 排列计数 Lucas相关的知识,希望对你有一定的参考价值。

code: 

#include <bits/stdc++.h>   
#define N 2000004    
#define LL long long 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std; 
LL mod;               
LL fac[N],inv[N],f[N],size[N];    
LL qpow(LL x,LL y) 
{
    LL tmp=1ll;   
    for(;y;y>>=1,x=x*x%mod) if(y&1)    tmp=tmp*x%mod;   
    return tmp;    
}
LL C(int n, int m)          
{
    if (n<m)   return 0ll;
    if (n<mod && m<mod) return   fac[n]*inv[m]%mod*inv[n-m]%mod;
    return   C(n/mod,m/mod)*C(n%mod,m%mod);             
}      
int main() 
{ 
    // setIO("input"); 
    int i,j,n; 
    scanf("%d%lld",&n,&mod);      
    fac[0]=inv[0]=1ll; 
    for(i=1;i<=n;++i)     fac[i]=fac[i-1]*1ll*i%mod,inv[i]=qpow(fac[i],mod-2);      
    for(i=0;i<=2*n;++i)   f[i]=1ll;   
    for(i=n;i>0;i--){
        size[i]++;
        size[i/2]+=size[i];
    }
    for(i=n;i>=1;--i) 
    {         
        if(size[i]==1) continue;   
        else
        { 
            f[i]=C(size[i]-1,size[i*2])*f[i*2]%mod*f[i*2+1]%mod; 
            //          printf("%d %d
",size[i]-1,size[i*2]);     
            // printf("%lld %lld %lld
",C(i-1,size[i*2]),f[i*2],f[i*2+1]);                        
            // printf("%lld
",f[i]);     
        }  
    }
    printf("%lld
",f[1]);    
    return 0; 
}

  

以上是关于bzoj 2111: [ZJOI2010]Perm 排列计数 Lucas的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ2111[ZJOI2010]Perm 排列计数 组合数

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

BZOJ 2111 [ZJOI2010]Perm 排列计数

组合数学+lucas定理+逆元 BZOJ2111 [ZJOI2010]Perm 排列计数

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

bzoj 2111 [ZJOI2010]Perm 排列计数(DP+lucas定理)