Lucas定理

题目
Lucas定理要求mod为素数

#include
#include 
using namespace std;
#define Mod 1000000007
typedef long long LL;
LL mod;
/*
根据费马小定理:

已知(a, p) = 1,则 a^(p-1) ≡ 1 (mod p),  所以 a*a^(p-2) ≡ 1 (mod p)。

也就是 (m!)的取模逆元为 (m!)^p-2 ;
*/
LL quick_mod(LL a, LL b)
{
    LL ans = 1;
    a %= mod;
    while(b)
    {
        if(b & 1)
        {
            ans = ans * a % mod;
        }
        b >>= 1;
        a = a * a % mod;
    }
    return ans;
}
LL C(LL a, LL b) {
    if(a < b)   return 0;
    LL ans = 1, ca = 1, cb = 1;
    for(LL i = 0; i < b; ++i) {
        ca = (ca * (a - i))%mod;
        cb = (cb * (b - i))%mod;
    }
    ans = (ca*quick_mod(cb, mod - 2)) % mod;
    return ans;
}
LL Lucas(LL n,LL m)
{
    if(m==0) return 1;
    return C(n%mod,m%mod)*Lucas(n/mod,m/mod);
}
int main()
{
    int t;
    scanf("%d",&t);
    LL a,b;
     while(t--)
        {
            scanf("%I64d%I64d%I64d",&a,&b,&mod);
        printf("%I64d\n",Lucas(a,b));
        }
}

你可能感兴趣的:(Lucas定理)