乘法逆元+扩展欧几里得+Lucas

来源:互联网 发布:搜索算法工程师 编辑:程序博客网 时间:2024/05/18 16:36

代码:

void e_gcd(LL a, LL b, LL &x, LL &y){    if(b == 0)    {        x = 1; y = 0;        return ;    }    e_gcd(b, a % b, x, y);    int tm = x; x = y;    y = tm - a / b * y;}LL lucas(int n, int m, int p){    LL ans = 1;    while(m && n && ans)    {        ans = (ans * c_mn(n % p, m % p, p)) % p;        m /= p;        n /= p;    }    return ans;}LL c_mn(LL a, LL b, LL p){    if(a < b)   return 0;    if(a == b)  return 1;    if(b > a - b)   b = a - b;    LL ca, cb;    ca = cb = 1;    for(LL i = 0; i < b; i++)    {        ca = (ca * (a - i)) % p;        cb = (cb * (b - i)) % p;    }    LL x, y;    e_gcd(cb, p, x, y);    x = ((x % p) + p) % p;    LL ans = (ca * x) % p;    return ans;}


原创粉丝点击