lucas定理快速求解组合数(适用于MOD较小)

lucus求解组合数的时间复杂度为

O(MODlogn(MOD))

适用于MOD较小但n较大的情况

模板:

复制代码
LL MOD=1e6+3;

LL QuickExp(LL base,LL exp)
{
    LL res=1;
    while(exp)
    {
        if(exp&1)
        {
            res*=base;
            res%=MOD;
        }
        base*=base;
        base%=MOD;
        exp>>=1;
    }
    return res;
}
LL C(LL n,LL k)
{

    if(n<k) return 0;
    LL up=1,down=1;
    for(int i=1;i<=n-k;i++)
    {
        down=down*i%MOD;
        up=up*(n-i+1)%MOD;
    }
    return up*QuickExp(down,MOD-2)%MOD;
}
LL Lucas(LL a,LL b)
{
    if(a<MOD&&b<MOD) return C(a,b);
    else return Lucas(a/MOD,b/MOD)*C(a%MOD,b%MOD)%MOD;
}
View Code
复制代码

 

posted @   80k  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示