快速卢卡斯模板

ll fac[maxn];
void init()
{
    fac[0] = 1;
    for(int i = 1; i <= maxn; i++)
        fac[i] = fac[i-1] * i % MOD;
    return;
}
ll _pow(ll x, ll y)
{
    ll res = 1,tmp = x % MOD;
    while(y)
    {
        if(y & 1)
            res = res * tmp % MOD;
        tmp = tmp * tmp % MOD;
        y >>= 1;
    }
    return res;
}
ll C(ll n, ll m)
{
    if(m > n)
        return 0;
    return fac[n] * _pow(fac[m] * fac[n-m], MOD-2) % MOD;
}

ll lucas(ll n, ll m)
{
    if(m == 0)
        return 1;
    return (C(n%MOD, m%MOD)*lucas(n/MOD, m/MOD))%MOD;
}

你可能感兴趣的:(组合数学)