卢卡斯定理模板

适用于取模的数为素数

long long qsm(long long a,long long b,long long m)
{
    long long res=1;
    while(b)
    {
        if(b&1)
        {
            res=res*a%m;
        }
        a=a*a%m;
        b>>=1;
    }
    return res;
}
long long inv(long long a,long long m)
{
    return qsm(a,m-2,m);
}
long long comb(long long a,long long b,long long m)
{
    if(a<b)
        return 0;
    if(a==b)
        return 1;
    if(b>a-b)
        b=a-b;
    long long ans=1,ca=1,cb=1;
    for(long long i=0; i<b; i++)
    {
        ca=(ca*(a-i))%m;
        cb=(cb*(b-i))%m;
    }
    ans=(ca*inv(cb,m))%m;
    return ans;
}
long long lucas(long long a,long long b,long long m)
{
    long long res=1;
    while(a&&b&&res)
    {
        res=(res*comb(a%m,b%m,m))%m;
        a/=m;
        b/=m;
    }
    return res;
}
//调用 :lucas(下标,上标,取模的数)

你可能感兴趣的:(模板)