MyAcmTemplate

Lucas

///lucas(n,m,p)=c[n%p][m%p]*lucas(n/p,m/p,p);  组合数取模 p<10^5

LL fact[100100];  

LL QuickPow(LL x,LL t,LL m)  
{  
    if(t==0) return 1LL;  
    LL e=x,ret=1LL;  
    while(t)  
    {  
        if(t&1) ret=(ret*e)%m;  
        e=(e*e)%m;  
        t>>=1LL;  
    }  
    return ret%m;  
}  

void get_fact(LL p)  
{  
    fact[0]=1LL;  
    for(int i=1;i<=p+10;i++)  
        fact[i]=(fact[i-1]*i)%p;  
}  

LL Lucas(LL n,LL m,LL p)  
{  
    ///lucas(n,m,p)=c[n%p][m%p]*lucas(n/p,m/p,p);  
    LL ret=1LL;  
    while(n&&m)  
    {  
        LL a=n%p,b=m%p;  
        if(a<b) return 0;  
        ret=(ret*fact[a]*QuickPow((fact[b]*fact[a-b])%p,p-2,p))%p;  
        n/=p; m/=p;  
    }  
    return ret%p;  
}